Я видел здесь несколько сообщений, в которых говорилось, что нельзя использовать $_REQUEST
переменную. Обычно я этого не делаю, но иногда это удобно. Что с этим не так?
php
methods
form-submit
sprugman
источник
источник
$_REQUEST
. См. Php.net/request_order. Я только что наткнулся на этот перерыв в обратной совместимости, когда ожидал, что будут данные cookie,$_REQUEST
и задаюсь вопросом, почему они не работают! Итак, самая большая причина избегать использования $ _REQUEST заключается в том, что ваш скрипт не может установитьrequest_order
сам себя (это такPHP_INI_PERDIR
), поэтому изменение php.ini может легко нарушить предположения, на которых построен ваш скрипт. Лучше поместить эти предположения прямо в ваш сценарий.Ответы:
Там абсолютно ничего плохого с принятием вход от обоих
$_GET
и$_POST
комбинированным способом. Фактически, это то, что вы почти всегда хотите делать:для простого идемпотентного запроса, обычно отправляемого через GET, существует вероятность того, что объем данных, который вы хотите, не поместится в URL-адрес, поэтому на практике он был преобразован в запрос POST.
для запроса, который имеет реальный эффект, вы должны проверить, что он отправлен методом POST. Но способ сделать это - проверить
$_SERVER['REQUEST_METHOD']
явно, а не полагаться на$_POST
пустоту для GET. И в любом случае, если метод естьPOST
, вы все равно можете извлечь некоторые параметры запроса из URL-адреса.Нет, проблема
$_REQUEST
не в объединении параметров GET и POST. Дело в том, что он также по умолчанию включает$_COOKIE
. А файлы cookie на самом деле совсем не похожи на параметры отправки формы: вы почти никогда не захотите рассматривать их как одно и то же.Если вы случайно установили на своем сайте файл cookie с тем же именем, что и один из параметров вашей формы, то формы, которые полагаются на этот параметр, загадочным образом перестанут работать должным образом из-за того, что значения файлов cookie переопределяют ожидаемые параметры. Это очень легко сделать, если у вас есть несколько приложений на одном сайте, и может быть очень сложно отладить, когда у вас всего пара пользователей со старыми файлами cookie, которые вы больше не используете, слоняясь и нарушая формы способами, не - воспроизводить может кто-то другой.
Вы можете изменить это поведение на гораздо более разумный
GP
(нетC
) порядок с конфигурацией request_order в PHP 5.3. Там, где это невозможно, я бы лично избегал$_REQUEST
и, если бы мне понадобился комбинированный массив GET + POST, создавал бы его вручную.источник
a="foo"
и $ _COOKIEa="bar"
, то будут ли здесь какие-либо переопределения / конфликты?Я покопался в некоторых сообщениях групп новостей о PHP Internals и нашел интересное обсуждение этой темы. Исходная нить шла о чем - то другом, но замечание Стефан Эссер, а (если не ) эксперт по вопросам безопасности в PHP мире превратили дискуссию в сторону последствия для безопасности использования $ _REQUEST на несколько постов.
Цитирование Стефана Эссера о внутреннем устройстве PHP
и в более позднем ответе в той же теме
Обсуждение продолжается еще несколько сообщений, и их интересно прочитать.
Как видите, основная проблема с $ _REQUEST не столько в том, что он содержит данные из $ _GET и $ _POST, но также из $ _COOKIE. Некоторые другие парни из списка предложили изменить порядок, в котором заполняется $ _REQUEST, например, сначала заполнив его $ _COOKIE, но это могло привести к множеству других потенциальных проблем, например, с обработкой сеанса .
Вы можете полностью опустить $ _COOKIES из глобального $ _REQUEST, чтобы он не был перезаписан каким-либо другим массивом (фактически, вы можете ограничить его любой комбинацией его стандартного содержимого, например руководство PHP по настройке variable_order ini говорит нам:
Но, опять же, вы также можете подумать о том, чтобы не использовать $ _REQUEST вообще, просто потому, что в PHP вы можете обращаться к Environment, Get, Post, Cookie и Server в их собственных глобальных объектах и иметь на один вектор атаки меньше. Вам все равно придется дезинфицировать эти данные, но беспокоиться об этом меньше.
Теперь вы можете задаться вопросом, почему все-таки $ _REQUEST существует и почему он не удаляется. Об этом также спрашивали на PHP Internals. Цитата Расмуса Лердорфа о том, почему существует $ _REQUEST? на внутреннем устройстве PHP
Во всяком случае, надеюсь, что это пролило свет.
источник
$_REQUEST
относится ко всем видам запросов (GET, POST и т. д.). Иногда это полезно, но обычно лучше указать точный метод ($ _GET, $ _POST и т. Д.).источник
$_REQUEST
обычно считается вредным по той же причине, что преобразования данных от простой до средней сложности часто выполняются в коде приложения, а не декларируются в SQL: некоторые программисты - отстой.Таким образом, если кто-то имеет тенденцию использовать
$_REQUEST
везде, я могу делать с помощью GET все, что мог бы с помощью POST, что означает настройку<img>
тегов на моем (вредоносном) сайте, которые заставляют пользователей, вошедших в ваш модуль электронной коммерции, молча покупать продукты, или я может заставить их нажимать на ссылки, что приведет к опасным действиям или раскрытию конфиденциальной информации (возможно, для меня).Однако это происходит из-за того, что новичок или, по крайней мере, неопытный программист PHP делает простые ошибки. Прежде всего, знайте, когда данные какого типа подходят. Например, у меня есть веб-сервис, который может возвращать ответы в URLEncoding, XML или JSON. Приложение решает, как отформатировать ответ, проверяя заголовок HTTP_ACCEPT, но его можно принудительно преобразовать в него, отправив
format
параметр.При проверке содержимого параметра формата он может быть отправлен через строку запроса или постданные, в зависимости от множества факторов, не последним из которых является то, хочет ли вызывающее приложение "& format = json", смешанное с его запросом. В данном случае
$_REQUEST
это очень удобно, поскольку избавляет меня от необходимости вводить что-то вроде этого:Я не собираюсь вдаваться в подробности, но достаточно сказать, что
$_REQUEST
использование не отговаривается, потому что оно изначально опасно - это просто еще один инструмент, который делает именно то, что от него требуется, понимаете ли вы эти последствия или нет - это плохое, ленивое или неосведомленное решение плохого, ленивого или неопытного программиста, которое вызывает эту проблему.Как
$_REQUEST
безопасно пользоватьсяaddslashes()
или*_escape_string()
. Собираетесь показать это пользователю?htmlentities()
илиhtmlspecialchars()
. Ожидаете числовых данных?is_numeric()
илиctype_digit()
. Фактически,filter_input()
и связанные с ним функции предназначены только для проверки и очистки данных. Всегда используйте эти инструменты.$post_clean
. В качестве альтернативы вы можете просто очистить непосредственно в суперглобальных таблицах, но причина, по которой я рекомендую использовать отдельную переменную, заключается в том, что это позволяет легко обнаруживать уязвимости в коде, поскольку все , что указывает непосредственно на суперглобальный, а не на его очищенный эквивалент, считается опасной ошибкой. ,В заключение запомните это простое правило:
БЕЗОПАСНОСТЬ - ЭТО ВЫ ДЕЛАЕТЕ, ЛЮДИ!
РЕДАКТИРОВАТЬ:
Я настоятельно рекомендую совет bobince: если можете, установите
request_order
параметр в php.ini на «GP»; то есть без компонента cookie. Для этого почти нет рационального объяснения в 98% + случаев, так как данные cookie почти никогда не следует рассматривать как сопоставимые со строкой запроса или постданными.PS, Анекдот!
Я знал программиста, который придумал
$_REQUEST
место для простого хранения данных, которые были бы доступны суперглобальным способом. Важные имена пользователей и пароли, пути к файлам, вы его называете и он хранился в$_REQUEST
. Он был немного удивлен (хотя, к сожалению, не комично), когда я рассказал ему, как ведет себя эта переменная. Излишне говорить, что эта практика свергнута.источник
Запросы GET должны быть идемпотентными, а запросы POST - нет. Это означает, что данные в
$_GET
и$_POST
обычно следует использовать по-разному.Если ваше приложение использует данные из
$_REQUEST
, оно будет вести себя одинаково для запросов GET и POST, что нарушает идемпотентность GET.источник
Это расплывчато. Вы не действительно знаете , как данные , полученные для вас , так как он несет почту, получить и данные печенья. Я не думаю, что это всегда плохо, если только вам не нужно знать или ограничивать способ доставки.
источник
Мне действительно нравится его использовать. Это дает вам гибкость в использовании GET или POST, которые могут пригодиться для таких вещей, как формы поиска, где большую часть времени данные отправляются POST, но иногда вы хотите сказать ссылку на конкретный поиск, поэтому вы можете вместо этого использовать параметры GET ,
Кроме того, если вы посмотрите на многие другие языки (например, ASP.NET), они вообще не делают различий между переменными GET и POST.
ETA :
Я никогда не использовал REQUEST для получения значений COOKIE, но я думаю, что Кайл Батт очень хорошо отмечает в комментариях к этому сообщению об этом. НЕ рекомендуется использовать REQUEST для получения значений COOKIE. Я считаю, что он прав в том, что есть реальная возможность подделки межсайтовых запросов, если вы это сделаете.
Кроме того, порядок, в котором данные загружаются в REQUEST, контролируется параметрами конфигурации в php.ini (variables_order и request_order). Итак, если у вас есть одна и та же переменная, переданная через POST и GET, какая из них фактически попадает в REQUEST, зависит от этих настроек ini. Это может повлиять на переносимость, если вы зависите от определенного порядка и эти параметры настроены иначе, чем вы ожидаете.
источник
Важно понимать, когда использовать POST, когда использовать GET и когда использовать cookie. С $ _REQUEST значение, на которое вы смотрите, могло исходить от любого из них. Если вы ожидаете получить значение из POST, GET или COOKIE, для тех, кто читает ваш код, более информативно использовать конкретную переменную вместо $ _REQUEST.
Кто-то еще указал, что вы не хотите, чтобы все POST или файлы cookie были переопределены GET, потому что для всех них существуют разные межсайтовые правила, например, если вы возвращаете данные ajax при использовании $ _REQUEST, вы уязвимы к атаке межсайтового скрипта.
источник
Единственный раз, когда использование
$_REQUEST
- неплохая идея - это GET.И даже с GET,
$_GET
это короче, чем набирать$_REQUEST
;)источник
$_POST
когда важно, чтобы данные были POSTDATA. Следует использовать,$_REQUEST
когда данные не зависят от используемой HTTP-команды. Во всех этих случаях следует тщательно дезинфицировать все входные данные.Я мог бы использоваться только в том случае, если вы хотите получить текущий URL-адрес или имя хоста, но для фактического анализа данных из этого URL-адреса, таких как параметры, с использованием символа &, это, вероятно, не очень хорошая идея. В общем, вы не хотите использовать расплывчатое описание того, что вы пытаетесь сделать. Если вам нужно быть конкретным, где $ _REQUEST - это плохо, если вам не нужно конкретизировать, не стесняйтесь использовать его. Я бы подумал.
источник
$_REQUEST
с$_SERVER['QUERY_STRING']
?Если вы знаете, какие данные вам нужны, вам следует явно запросить их. IMO, GET и POST - это два разных животных, и я не могу придумать вескую причину, по которой вам когда-либо понадобится смешивать данные публикации и строки запроса. Если у кого-то есть, мне было бы интересно.
Может быть удобно использовать $ _REQUEST, когда ваши скрипты могут одинаково реагировать на GET или POST. Я бы сказал, что это должно быть чрезвычайно редким случаем, и в большинстве случаев предпочтительны две отдельные функции для обработки двух отдельных концепций или, по крайней мере, проверка метода и выбор правильных переменных. За ходом выполнения программы обычно намного легче следить, когда нет необходимости в перекрестных ссылках, откуда могут поступать переменные. Будьте добры к человеку, который должен поддерживать ваш код в течение 6 месяцев. Это может быть ты.
Помимо проблем с безопасностью и WTF, вызванных куки-файлами и переменными среды в переменной REQUEST (не заставляйте меня начинать с GLOBAL), подумайте, что может произойти в будущем, если PHP начнет изначально поддерживать другие методы, такие как PUT и DELETE. Хотя крайне маловероятно, что они будут объединены в суперглобал REQUEST, возможно, они могут быть включены как опция в настройке variable_order. Таким образом, вы действительно понятия не имеете, что содержит REQUEST и что имеет приоритет, особенно если ваш код развернут на стороннем сервере.
POST безопаснее, чем GET? На самом деле, нет. Лучше использовать GET там, где это возможно, потому что в ваших журналах легче увидеть, как ваше приложение эксплуатируется при атаке. POST лучше подходит для операций, которые влияют на состояние домена, потому что пауки обычно не следят за ними, а механизмы предиктивной выборки не удаляют весь ваш контент, когда вы входите в свою CMS. Однако вопрос был не в достоинствах GET и POST, а в том, как получатель должен обрабатывать входящие данные и почему их объединять плохо, так что это действительно просто BTW.
источник
Я думаю, с этим нет проблем
$_REQUEST
, но мы должны быть осторожны при его использовании, так как это набор переменных из 3 источников (GPC).Я думаю,
$_REQUEST
что все еще доступно, чтобы сделать старые программы совместимыми с новыми версиями php, но если мы начнем новые проекты (включая новые библиотеки), я думаю, нам не следует$_REQUEST
больше использовать , чтобы сделать программы более понятными. Нам следует даже подумать об удалении использования$_REQUEST
и замене на функцию-оболочку, чтобы облегчить программу, особенно при обработке больших отправленных текстовых данных, поскольку они$_REQUEST
содержат копии$_POST
.источник
Вау ... только что некоторые из моих скриптов перестали работать из-за обновления до PHP 5.3 . Сделал то же самое: предположим, что файлы cookie будут установлены при использовании
$_REQUEST
переменной. С апгрейдом точно перестал работать.Теперь я вызываю значения cookie отдельно, используя
$_COOKIE["Cookie_name"]
...источник
Основная проблема заключается в том, что он содержит файлы cookie, как говорили другие.
В PHP 7 это можно сделать:
Это позволяет избежать проблемы с файлами cookie и в худшем случае дает пустой массив, а в лучшем случае - слияние $ _GET и $ _POST, причем последнее имеет приоритет. Если вас не слишком беспокоит возможность URL-инъекции параметров через строку запроса, это довольно удобно.
источник
Это очень небезопасно. Также это неудобно, так как вы не знаете, получаете ли вы POST или GET, или другой запрос. Вы действительно должны знать разницу между ними при разработке своих приложений. GET очень небезопасен, поскольку он передается в URL-адресе и не подходит почти для чего-либо, кроме навигации по страницам. POST, хотя и небезопасен сам по себе, обеспечивает один уровень безопасности.
источник