Всем, привет! Вот такой вот вопрос у меня к вам. Как вы фильтруете входящие текстовые данные? Есть данные из всяких там чекбоксов, радиокнопок и прочего. Там все достаточно понятно. Данные как правило числовые. Прогоняю их через: PHP: filter_var($var, FILTER_VALIDATE_INT); Чаще с указанными доп. опциями: PHP: filter_var($var, FILTER_VALIDATE_INT, ['options' => ['default' => 0, 'min_range' => 0, 'max_range' => 5]]); Если данные строковые прогоняю их через функцию, которая сверяет значение с вайтлистом. Если тру, можно записывать в базу. Если нет, выдаем ошибку. А вот с текстовыми данными сложнее. Так как по сути записывать придется текст введенный пользователем. Какие фильтры лучше использовать, чтобы обезопасить себя от SQL-инъекций и XSS? Поделитесь опытом кому не жалко)
подготовленные запросы (https://secure.php.net/manual/ru/mysqli.prepare.php https://secure.php.net/manual/ru/pdo.prepare.php) или экранирование https://secure.php.net/manual/ru/pdo.quote.php https://secure.php.net/manual/ru/mysqli.real-escape-string.php Когда выводишь данные из базы используй https://secure.php.net/manual/ru/function.htmlspecialchars.php так как в базе обычно принято хранить оригинальные данные от пользователя, а при выводи экранировать опять.
используй фильтр инпут / array. Причина: недостаток фильтрВара в проверке существовании пост/гет ключей, и придется множественно проверять в isset ( var, var var, ... ) https://php.ru/manual/function.filter-input-array.html
Ещё, если нужно выводить данные, содержащие HTML, но обезопасить себя от скриптов в них (XSS), есть такая штука: http://htmlpurifier.org/
читай внимательно сообщение. htmlspechialchars убивает HTML, а HtmlPurifier убивает только плохой html, хороший оставляет. Что считать плохим, что хорошим - определяет программист. Примерно как strip_tags со списком разрешённых тегов, только ещё можно гибко настроить атрибуты и прочее.
Я, конечно, знал про подготовленные запросы. Но сейчас решил изучить вопрос поподробнее. То есть, как я понял, при использовании подготовленных запросов, запрос на сервер и сами данные идут по отдельности. То есть даже если переменная будет содержать SQL-инъекцию, она не сможет изменить запрос и переменная просто запишется в таблицу как простой текст. Правильно я понял?