На данный момент я много работаю над основанной на PHP CMS, и пока я нахожусь в этом, я хотел бы переместить всю обработку и санирование входа пользователя в одно центральное место. (На данный момент здесь $ _REQUEST, здесь $ _GET и т. Д.).
Мне очень нравится filter_input () и хотел бы использовать его для базовой санитарии, но я не понимаю, действительно ли эта функция готова к производству. Например, в документации указаны следующие параметры для $ type
INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, INPUT_SESSION (not implemented yet) and INPUT_REQUEST (not implemented yet).
функция существует с 5.2.0, почему два важных элемента еще не реализованы? Если я хочу получать данные из $ _REQUEST, вы должны использовать обходные пути из заметок, внесенных пользователем. Есть ли для этого особая причина? Является ли эта функция еще какой-то бета-версией? Насколько он заслуживает доверия в качестве первого вызова обработки входящих данных?
Может быть, кто-то, кто знаком с процессом разработки PHP, может пролить свет на это.
Я хотел бы переместить всю обработку и санитарию ввода пользователя в одно центральное место
Да, как это было бы прекрасно. Это невозможно. Это не то, как работает текстовая обработка.
Если вы вставляете текст из одного контекста в другой, вам нужно использовать правильные escape-последовательности. (mysql_real_escape_string для строковых литералов MySQL, htmlspecialchars для содержимого HTML, urlencode для параметров URL, другие для конкретных контекстов). В начале вашего скрипта, когда вы фильтруете, вы не знаете, где ваш вход будет завершен, поэтому вы не знаете, как его избежать.
Возможно, одна входная строка идет как в базу данных (должна быть экранирована SQL), так и непосредственно на страницу (должна быть скрыта HTML). Никого не избежать, которое охватывает оба этих случая. Вы можете использовать оба escapes один за другим, но тогда значение в HTML будет иметь странные обратные косые черты, появляющиеся в нем, и копия в базе данных будет заполнена амперсандами. Несколько раундов этого неправильного кодирования, и вы получаете такую ситуацию, когда каждый раз, когда вы что-то редактируете, длинные строки из \\\\\\\\\\\\\\\\\\\\
&
публично заявить.
Единственный способ, с помощью которого вы можете безопасно отфильтровать за один раз во время запуска, – это полностью удалить все символы, которые нужно экранировать в любом из контекстов, в которые вы собираетесь их использовать. Но это означает отсутствие апострофов или обратных косых черт в вашем HTML, нет амперсандов или менее – в вашей базе данных, и, вероятно, тоже придется загружать всю ненужную пунктуацию, не связанную с URL-адресом. Для простого сайта, который не принимает произвольный текст, вы могли бы с этим справиться. Но обычно нет.
Таким образом, вы можете бежать только на лету, когда один тип текста переходит в другой. Лучшей стратегией для предотвращения этой проблемы является избежание конкатенации текста в другие контексты настолько, насколько это возможно, например, с помощью параметризованных запросов вместо построения строки SQL и определения функции echo(htmlspecialchars())
с хорошим краткое имя, чтобы сделать его менее трудным для ввода, или с помощью альтернативной системы шаблонов, которая по умолчанию удаляет HTML-файлы.
«фильтрация ввода» или «санитария» – абсурдная идея. Держитесь подальше от него.
Объяснения и дальнейшее обсуждение
Каков наилучший метод для дезинфекции пользовательского ввода с помощью PHP?
Что еще я должен делать для дезинфекции ввода пользователя?
При программировании вы должны быть как можно более ограничительными на своем входе. Это относится и к источникам данных. $ _REQUEST содержит все в $ _GET, $ _POST и $ _COOKIE, что может привести к проблемам.
Подумайте, например, что произойдет, если плагин вашей CMS вводит новый специальный ключ в один из них, который существует как значимый ключ в другом плагине?
Поэтому никогда не используйте $ _REQUEST. Используйте $ _GET, $ _POST или $ _COOKIE, в зависимости от вашего сценария. Это хорошая практика быть как можно более строгой, и это не имеет ничего общего с PHP, но с программированием в целом.