Я понимаю, что фильтрация входных данных и экранирование выходных данных жизненно важны из соображений безопасности.
Я бы сказал, что экранирование выходных данных жизненно важно из соображений безопасности и корректности, а фильтрация входных данныхПотенциально полезная мера для углубленной защиты и обеспечения соблюдения конкретных правил приложения.
Этап фильтрации входных данных и этап экранирования выходных данных обязательно являются отдельными задачами и не могут быть объединены в один этап, не в последнюю очередь потому, что существуютмного разных типов экранирования выходных данных, и для каждого контекста вывода должен быть выбран правильный (например, экранирование HTML на странице, экранирование URL для создания ссылки, экранирование SQL и т. д.).
К сожалению, PHP традиционно очень смутно относится к этим вопросам и поэтому предлагает множество функций смешанных сообщений, которые могут ввести вас в заблуждение.
В приведенном ниже примере поля это простой текст, поэтому всеМне нужно сделать, это продезинфицировать.
Да.Увы, FILTER_SANITIZE_STRING
ни в коем случае не является вменяемым дезинфицирующим средством.Он полностью удаляет некоторый контент (strip_tags
, который сам по себе крайне нечувствителен), в то время как HTML-контент избегает другого контента.например, кавычки превращаются в "
.Это бессмыслица.
Вместо этого для очистки входных данных посмотрите:
проверка правильности строки для используемой кодировки (возможно, UTF-8;см. например это регулярное выражение для этого);
удаление управляющих символов, U + 0000 – U + 001F и U + 007F – U + 009F.Разрешить ввод новой строки только в преднамеренных многострочных текстовых полях;
, удаляя символы, которые не подходят для использования в разметке ;
проверка входных данных соответствует требованиям приложения для каждого поля, для данных, модель содержимого которых более специфична, чем произвольные текстовые строки.Хотя ваше экранирование должно правильно обрабатывать символ <
, вероятно, хорошей идеей является раннее избавление от него в полях, где нет смысла его иметь.
Для выхода экранированияшаг, который я обычно предпочитаю от htmlspecialchars()
до htmlentities()
, хотя правильное использование аргумента UTF-8
останавливает последнюю функцию, нарушающую обычное поведение.