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