Я хотел бы, чтобы переместить всю обработку и санацию пользовательского ввода в одном месте
Да, как хорошо, что будет. Это невозможно. Это не то, как работает текстовая обработка.
Если вы вставляете текст из одного контекста в другой, вам нужно использовать правильные экраны. (mysql_real_escape_string для строковых литералов MySQL, htmlspecialchars для содержимого HTML, urlencode для параметров URL, другие для конкретных контекстов). В начале вашего скрипта, когда вы фильтруете, вы не знаете, где ваш вход будет завершен, поэтому вы не знаете, как его избежать.
Возможно, что одна входная строка перемещается как в базу данных (должна быть экранирована SQL), так и непосредственно на страницу (должна быть скрыта HTML). Никого не избежать, которое охватывает оба этих случая. Вы можете использовать оба escapes один за другим, но тогда значение в HTML будет иметь странные обратные косые черты, появляющиеся в нем, и копия в базе данных будет заполнена амперсандами. Несколько раундов этого неправильного кодирования, и вы получаете ту ситуацию, когда каждый раз, когда вы что-то редактируете, выходят длинные строки \\\\\\\\\\\\\\\\\\\\
и &
.
Единственный способ можно безопасно фильтровать за один раз во время запуска является полное удаление всех символов, которые должны быть экранированы в любой контекстов, которые вы собираетесь использовать их. Но это не означает, что нет апострофа или обратную косую черту в вашем HTML, без амперсандов или менее - в вашей базе данных, и, вероятно, также должна быть загружена целая нагрузка другой URL-недружественной пунктуации. Для простого сайта, который не принимает произвольный текст, вы могли бы с этим справиться. Но обычно нет.
Таким образом, вы можете убежать только на лету, когда один тип текста переходит в другой. Лучшая стратегия, чтобы избежать проблемы, заключается в том, чтобы избежать конкатенации текста в другие контексты настолько, насколько это возможно, например, с помощью параметризованных запросов вместо построения строки SQL и определения функции echo(htmlspecialchars())
с красивым коротким именем, чтобы сделать это меньше работы для ввода или использования альтернативной системы шаблонов, которая по умолчанию удаляет HTML-файлы.
и в 2015 году до сих пор, кажется, не быть никакой реализации за $ _SESSION, по крайней мере не проверил другие пока им только собирание PHP мяч снова, но filter_var - это работа. – Chris
'INPUT_SESSION' и' INPUT_FILES' не реализованы (хотя '$ _FILES' представляет многомерный вариант использования и по умолчанию не похож на остальных). Используйте 'filter_var_array()' для '$ _SESSION'. Я также могу отметить, что нет «INPUT_DATABASE», но у вас все еще есть обязанности. Снова попробуйте 'filter_var_array()'. –