Работаю с MySQL через PDO. Есть данные которые приходят из кукисов и которые нужно сверить, т.к. это данные в любом случае приходят из вне, к ним нужно относиться с наибольшим вниманием. Запрос к БД делается через prepare и с именованными параметрами. Нужно ли делать дополнительную проверку данный перед отправкой в prepare? Если да, то что желательно сделать?
В принципе, если данные участвуют только в условии выборки, а не записываются в базу и с применением плейсхолдеров, то риски существенно уменьшаются, но лично я фильтрую любые данные, которые приходят с клиента (filter_input() / filter_var() и т.д. + (int) / (float) для числовых), независимо от того, как и где они будут дальше задействованы, чего и вам желаю.
Если используешь PDO достаточно фильтровать вредоносные js скрипты, которые могут выполниться если данные из базы потом выводятся в браузер.
В данном случае, да, речь о выборке, хотя конечно будет и запись данных из формы. Если с цифрами всё как-то по проще, то вот проверка строк, в которые могут пытаться запихнуть всё что угодно интереснее. Т.е. к примеру есть форма в которой юзер вводит что-то и есть админка, в которой я этот текст буду видеть. По сути нужно себя обезопасить себя таким образом, чтоб при отображении текста не отрабатывался код, который возможно могут вписать в форму. Есть смысл в функциях: PHP: htmlentities() или htmlspecialchars() strip_tags() ?
Вы куда-то не туда полезли. Для сверки подготовленного запроса достаточно. --- Добавлено --- Плюс, как выше написали, можно дополнительно проверять/фильтровать контент на недопустимые символы и т.п. После этого в нек. случаях можно даже подготовленный запрос не использовать.
Смысл в функциях есть, но только там, где они уместны. Если, к примеру, у вас в админке используется WYSIWYG-редактор, то strip_tags как-то не очень покатит. Для таких случаев, можно использовать такие решения, как HTML Purifier --- Добавлено --- И кстати, данные, если мы не говорим об инъекциях, опасны не столько на входе, сколько при выводе.
Не надо фильтровать скрипты, если только не нужна возможность использовать ограниченное количество тегов html. Просто при выводе htmlspecialchars.
Т.е. по сути в базу пусть пишется всё как приходит, единственное можно (filter_input() / filter_var() и т.д. + (int), а вот отдавать уже через htmlspecialchars Я правильно понял?
@AlexandrS Ага. Исключение - если поле должно содержать html, т.е. выводится потом с заданным форматированием. Тогда либо даёшь strip_tags с указанием разрешённых тегов, либо используешь что-то более продвинутое, например, HTMLPurifier
Странный вопрос. Достаточно посмотреть на очищающие фильтры и фильтры валидации, чтобы получить ответ.
PHP: filter_input_array ( INPUT_POST, [ 'user' => FILTER_DEFAULT, 'x' => [ 'filter' => FILTER_CALLBACK, 'options' => function ( $v ) { if ( in_array ( $v, range ( 1, 73 ) ) ) { return (int)$v; } return null; } ], 'y' => [ 'filter' => FILTER_CALLBACK, 'options' => function ( $v ) { if ( in_array ( $v, range ( 1, 54 ) ) ) { return (int)$v; } return null; } ], 'color' => [ 'filter' => FILTER_CALLBACK, 'options' => function ( $v ) { if ( in_array ( $v, range ( 1, 17 ) ) ) { return (int)$v; } return null; } ] ] )
Я вот что не могу сообразить, есть код: PHP: <?php function foo(){ $string = "test,+dg..."; $string = filter_var($string, FILTER_VALIDATE_REGEXP, [ 'options' => [ "regexp" => "/[a-z0-9-,;=.]+$/is" ] ]); return $string; } echo foo(); ?> По сути должно выдать FALSE, но возвращает вводную строку, где-то я туплю, но не могу понять в каком именно месте. Мне нужно чтоб проходили строки с допустимыми символами a-z0-9-,;=. в строке есть +, но при этом всё нормально проходит валидацию.
Я не обозначил начало строки в регулярке, поэтому она дергала любой понравившейся ей кусок и выдавала TRUE, нужно было: PHP: "regexp" => "/^[a-z0-9-,;=.]+$/is"