Intereting Posts
Как изменить размер изображения высокого разрешения с помощью PHP если выражение в середине конкатенации? Отношения при обновлении объекта в Symfony2 – один-на-один и один-ко-многим не работают будет ли ложный возвращенный PDO execute () таким же, как исключение, которое оно выбрало? Как конструктор дочернего класса взаимодействует с конструктором родительского класса в php? Как пропустить JSON-массив с помощью PHP Как выбрать строки, начинающиеся с «<img» с помощью оператора IF Сообщение Ajax, отображающее неадекватное сообщение Интерпретация возвращаемого значения функции непосредственно в виде массива Cakephp-сессия уничтожается после перенаправления Алгоритм Class Scheduling для наилучшего соответствия критериям? Уничтожение сеанса PHP создание приложений на основе ролей Ошибка чтения тела запроса HTTP из JSON POST в PHP Magento Сохранение массива Multiselect на пользовательской модели

Почему filter_input () неполный?

На данный момент я много работаю над основанной на 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 будет иметь странные обратные косые черты, появляющиеся в нем, и копия в базе данных будет заполнена амперсандами. Несколько раундов этого неправильного кодирования, и вы получаете такую ​​ситуацию, когда каждый раз, когда вы что-то редактируете, длинные строки из \\\\\\\\\\\\\\\\\\\\ &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; публично заявить.

Единственный способ, с помощью которого вы можете безопасно отфильтровать за один раз во время запуска, – это полностью удалить все символы, которые нужно экранировать в любом из контекстов, в которые вы собираетесь их использовать. Но это означает отсутствие апострофов или обратных косых черт в вашем HTML, нет амперсандов или менее – в вашей базе данных, и, вероятно, тоже придется загружать всю ненужную пунктуацию, не связанную с URL-адресом. Для простого сайта, который не принимает произвольный текст, вы могли бы с этим справиться. Но обычно нет.

Таким образом, вы можете бежать только на лету, когда один тип текста переходит в другой. Лучшей стратегией для предотвращения этой проблемы является избежание конкатенации текста в другие контексты настолько, насколько это возможно, например, с помощью параметризованных запросов вместо построения строки SQL и определения функции echo(htmlspecialchars()) с хорошим краткое имя, чтобы сделать его менее трудным для ввода, или с помощью альтернативной системы шаблонов, которая по умолчанию удаляет HTML-файлы.

«фильтрация ввода» или «санитария» – абсурдная идея. Держитесь подальше от него.

Объяснения и дальнейшее обсуждение

Каков наилучший метод для дезинфекции пользовательского ввода с помощью PHP?

Что еще я должен делать для дезинфекции ввода пользователя?

При программировании вы должны быть как можно более ограничительными на своем входе. Это относится и к источникам данных. $ _REQUEST содержит все в $ _GET, $ _POST и $ _COOKIE, что может привести к проблемам.

Подумайте, например, что произойдет, если плагин вашей CMS вводит новый специальный ключ в один из них, который существует как значимый ключ в другом плагине?

Поэтому никогда не используйте $ _REQUEST. Используйте $ _GET, $ _POST или $ _COOKIE, в зависимости от вашего сценария. Это хорошая практика быть как можно более строгой, и это не имеет ничего общего с PHP, но с программированием в целом.