Как правильно фильтровать входящие данные?

Как правильно фильтровать входящие данные?

1. использовать PDO + Prepare Statements - использую

но дальше что?
когда использовать htmlentities, а когда htmlspecialchars?

Готовые шаблонизаторы просьба не предлагать т.к. я учусь и пытаюсь разобраться и понять что как и почему..
  • Вопрос задан
  • 623 просмотра
Пригласить эксперта
Ответы на вопрос 2
27cm
@27cm
TODO: Написать статус
Дальше сюда:
php.net/manual/ru/book.filter.php
htmlpurifier.org
github.com/ziadoz/awesome-php#filtering-and-validation


Когда использовать htmlentities, а когда htmlspecialchars?

Функция htmlentities() идентична htmlspecialchars() за исключением того, что htmlentities() преобразует все символы в соответствющие HTML-сущности (для тех символов, для которых HTML сущности существуют).
php.net/manual/ru/function.htmlentities.php

В HTML некоторые символы имеют особый смысл и должны быть представлены в виде HTML сущностей, чтобы сохранить их значение. Эта функция возвращает строку, над которой проведены эти преобразования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities().
php.net/manual/ru/function.htmlspecialchars.php
Ответ написан
Комментировать
@SilverSlice
Для начала предлагаю уточнить значение слова фильтровать, выделив следующие варианты обработки пользовательских данных.
  1. Валидация, т.е. проверка соответствия введенных пользователем данных вашей бизнес-логики.
  2. Фильтрация, т.е. преобразование входных данных определенным образом. Например, вы можете обрезать начальные пробелы в строке или вырезать из неё html-тэги.
  3. Форматирование данных для корректной вставки в БД, вывода в HTML и т.д.

Для выполнения первых двух пунктов в php есть расширение Filter, которое занимается проверкой и очисткой входных данных.

Третий пункт говорит, что если данные, полученные от пользователя, куда-либо подставляются, то они должны быть корректно отформатированы. Причем делать это нужно непосредственно в момент подстановки (записи в БД или вывода в html).

При выводе данных в html (если вы явно не допускаете вывод html-тегов) все специальные символы (кавычки, знаки больше и меньше, амперсанд) должны быть преобразованы в HTML-сущности. Этим как раз и занимается функция htmlspecialchars. Htmlentities преобразует не только эти символы, но и многие другие (точный список можно получить функцией get_html_translation_table). Если вы используете на сайте utf-8, то она вам вообще не нужна.

Теперь о том, на что стоит обратить внимание при использовании htmlspecialchars:
  • В третьем параметре нужно указать кодировку, которую вы используете на сайте.
  • Во втором параметре стоит указать флаг ENT_QUOTES, чтобы преобразовывались как двойные, так и одинарные кавычки. Потому как атрибуты могут быть записаны с использованием обеих (href="" и href=''). В html всегда стоит использовать кавычки при записи атрибутов (не пишите src=image1.jpg).
  • Во втором параметре вы также можете указать флаг ENT_SUBSTITUTE (для php >= 5.4). В случае, если ваша строка будет содержать некорректно закодированные символы, они будут заменены на символ юникода. Без указанного флага вы получите пустую строку (подробности).

Итоговый вариант использования htmlspecialchars:
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');


Советую также посмотреть документацию к библиотеке Zend\Escaper, которая содержит примеры корректного и некорректного форматирования данных при выводе в различные части html-документа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы