Я копался в некоторых сообщениях группы новостей на PHP Internals и нашел интересную дискуссию на эту тему.Начальная тема была о другом, но замечание Стефана Эссера, эксперта по безопасности (если не ) в мире PHP, перевело дискуссию о последствиях безопасности использования $ _REQUEST для нескольких сообщений.
Цитирование Стефан Эссер в PHP Internals
$ _ REQUEST - одна из самых больших слабостей дизайна в PHP.Каждое приложение, использующее $ _REQUEST, наиболее вероятно уязвимо для проблем с задержкой подделки межсайтовых запросов.(Это в основном означает, что, например, если существует файл cookie с именем (age), он всегда будет перезаписывать содержимое GET / POST и, следовательно, будут выполняться нежелательные запросы)
и в позже ответит на тот женить
Дело не в том, что кто-то может подделать GET, POST;COOKIE переменные.Речь идет о том факте, что COOKIE будут перезаписывать данные GET и POST в REQUEST.
Поэтому я мог заразить ваш браузер файлом cookie, который говорит, например, action = logout, и с этого дня вы больше не можете использовать приложение, потому что REQUEST[действие] будет выходить из системы навсегда (пока вы не удалите cookie вручную).
И заразить вас COOKIE так просто ...а) Я мог бы использовать XSS vuln в любом приложении на поддоменеб) Вы когда-нибудь пытались установить cookie для * .co.uk или * .co.kr, когда у вас там один домен?в) Прочие междоменные связи какими бы то ни было способами ...
И если вы считаете, что это не проблема, я могу вам сказать, что существует простая возможность установить, например, файл cookie * .co.kr, который приводит к тому, что несколько версий PHP просто возвращают белые страницы.Представьте себе: всего лишь один файл cookie, чтобы убить все страницы PHP в * .co.kr
И установить недопустимый идентификатор сеанса в файле cookie, действительном для * .co.kr, в переменную с именем + PHPSESSID = незаконно вы все еще можете использовать DOS для каждого PHP-приложения в Корее с помощью PHP-сессий ...
Обсуждение продолжается еще для нескольких публикаций и интересно прочитать.
Как видите, основная проблема с $ _REQUEST заключается не столько в том, что он содержит данные из $ _GET и $ _POST, но также из $ _COOKIE.Некоторые другие ребята из списка предложили изменить порядок, в котором заполняется $ _REQUEST, например, сначала заполнив его $ _COOKIE, но это может привести к множеству других потенциальных проблем, например, с обработкой сеанса .
Вы можете полностью опустить $ _COOKIES в глобальном $ _REQUEST, так что он не будет перезаписан ни одним из других массивов (фактически, вы можете ограничить его любой комбинацией его стандартного содержимого, например Руководство по PHP для параметра variable_order ini сообщает нам:
variable_order Устанавливает порядок переменной EGPCS (Environment, Get, Post, Cookie и Server)Например, если для variable_order задано значение «SP», тогда PHP создаст суперглобальные переменные $ _SERVER и $ _POST, но не создаст $ _ENV, $ _GET и $ _COOKIE. Установка в «» означает, что суперглобальные переменные не будут установлены.
Но опять же, вы можете также рассмотреть возможность не использовать $ _REQUEST вообще, просто потому, что в PHP вы можете обращаться к Environment, Get, Post, Cookie и Server в их собственных глобальных переменных и иметь на один вектор атаки меньше.Вам все еще нужно санировать эти данные, но беспокоиться об этом не стоит.
Теперь вы можете задаться вопросом, почему $ _REQUEST существует послевсе и почему это не снято.Об этом спрашивали и на PHP Internals.Цитируя Расмуса Лердорфа о Почему существует $ _REQUEST? в PHP Internals
Чем больше таких вещей мы удаляем, тем сложнее людям быстрее переходить на новые, более быстрые иболее безопасные версии PHP.Это вызывает гораздо большее разочарование для всех, чем несколько «некрасивых» унаследованных функций.Если есть достойная техническая причина, производительность илибезопасность, тогда мы должны внимательно посмотреть на это. В этом случае
то, на что мы должны обратить внимание, это не то, нужно ли нам удалять $ _REQUEST
но должны ли мы удалить данные cookie из него. Множество конфигураций
уже делаю это, включая все мои собственные, и есть
причина безопасности для того, чтобы не включать куки в $ _REQUEST. Большинство людей используют
$ _REQUEST означает GET или POST, не понимая, что он также может содержать
куки и как таковые плохие парни потенциально могут сделать некоторые инъекции куки
Трюки и ломать наивные приложения.
В любом случае, надеюсь, что это пролило свет.