Что плохого в использовании $ REQUEST []?


Я видел здесь несколько сообщений о том, чтобы не использовать $_REQUEST переменной. Обычно я этого не делаю, но иногда это удобно. Что с ним не так?

14 111

14 ответов:

нет абсолютно ничего плохого в принятии ввода от обоих $_GET и $_POST комбинированным способом. На самом деле это то, что вы почти всегда хотите сделать:

  • для простого идемпотентного запроса, обычно отправляемого через GET, есть возможность, что количество данных, которые вы хотите, не будет соответствовать URL-адресу, поэтому он будет мутирован в запрос POST вместо этого как практический вопрос.

  • запрос, который имеет реальный эффект, вы должны проверить, что он представлен методом POST. Но способ сделать это-проверить $_SERVER['REQUEST_METHOD'] явно, а не полагаться на $_POST будучи пустым для GET. И вообще, если метод POST, вы все еще можете взять некоторые параметры запроса из URL.

нет, проблема с $_REQUEST не имеет ничего общего с объединением параметров GET и POST. Это то, что он также, по умолчанию, включает $_COOKIE. И куки действительно не похожи на параметры представления формы вообще: вы почти никогда хочу относиться к ним как к одному и тому же.

если вы случайно получите набор файлов cookie на своем сайте с тем же именем, что и один из параметров формы, то формы, которые полагаются на этот параметр, таинственным образом перестанут работать должным образом из-за значений файлов cookie, переопределяющих ожидаемые параметры. Это очень легко сделать, если у вас есть несколько приложений на одном сайте, и может быть очень трудно отлаживать, когда у вас есть только несколько пользователей со старыми файлами cookie, которые вы больше не используете ломая формы так, как никто другой не может воспроизвести.

вы можете изменить это поведение гораздо более разумный GP (не C) порядке с request_order config в PHP 5.3. Там, где это невозможно, я лично бы избегал $_REQUEST и, если мне нужен комбинированный массив GET+POST, создайте его вручную.

я копался в некоторых сообщениях группы новостей на PHP Internals и нашел интересную дискуссию на эту тему. Начальная нить была о чем-то другом, но замечание Стефана Эссера, a (если не the) эксперт по безопасности в мире PHP обратил внимание на последствия для безопасности использования $_REQUEST для нескольких сообщений.

со ссылкой на Штефан Эссер на PHP Internals

$_REQUEST является одним из самые большие недостатки дизайна в PHP. Каждое приложение с помощью $_REQUEST-это, вероятно, наиболее уязвимых к задержке сайте перекрестного запроса Проблемы с подделками. (Это в основном означает, если, например, файл cookie с именем (возраст) существует он всегда будет перезаписывать содержимое GET / POST и поэтому нежелательные запросы будут выполнены)

и позже ответьте на тот же поток

речь идет не о том, что кто-то может подделать переменные GET, POST; COOKIE. Речь идет о том, что COOKIEs будут перезаписывать GET и POST данные в ЗАПРОС.

поэтому я мог бы заразить Ваш браузер с куки, который говорит, например действие=выход и с этого дня вы не можете использовать приложение больше, потому что запрос[действие] будет выходить из системы навсегда (пока вы вручную удалите файлы cookie).

и в том, чтобы заразить вас с cookie-это так просто...
a) я мог бы использовать XSS vuln в любом приложении на поддомене
Б) когда-нибудь попробовал установить cookie для *.co.uk или *.co.kr когда вы владеете a один домен там?
c) Другие кросс-Домены любыми способами...

и если вы считаете, что это не проблема, то я могу сказать вам, что существует простая возможность установить f. e.A*. co.kr cookie, который приводит в нескольких версиях PHP просто возвращаются белые страницы. Представьте себе: только один файл cookie, чтобы убить все страницы PHP в *.co.kr

и установив незаконный идентификатор сеанса в файле cookie действительно для *.co.kr в a переменная называется +PHPSESSID=незаконно вы все еще можете DOS каждый PHP применение в Корее с использованием PHP сессий...

обсуждение продолжается еще несколько сообщений и интересно читать.


Как вы можете видеть, основная проблема с $_REQUEST заключается не столько в том, что у него есть данные из $_GET и $_POST, но и из $_COOKIE. Некоторые другие ребята из списка предложили изменить порядок, в котором заполняется $_REQUEST, например, сначала заполните его $_COOKIE, но это может привести к многочисленным другим потенциальным проблемам, например, с обработкой сеанса.

вы можете полностью опустить $_COOKIES из $ _REQUEST global, так что он не будет перезаписан ни одним из других массивов (на самом деле, вы можете ограничить его любой комбинацией его стандартного содержимого, например PHP руководство по variable_order ini параметр говорит нам:

variable_order задает порядок разбора переменных EGPCS (Environment, Get, Post, Cookie и Server). Например, если variables_order установлен на "СП", то PHP будет создать суперглобальные переменные $_SERVER и $_POST, где, но не создать $_ENV, переменная $_GET, а $их помощью. Значение "" означает, что суперглобалы не будут установлены.

но опять же, вы можете также рассмотреть возможность не использовать $_REQUEST вообще, просто потому, что в PHP вы можете получить доступ к среде, Get, Post, Cookie и Серверу их собственные глобалы и имеют на один вектор атаки меньше. Вам все еще нужно санировать эти данные, но это еще одна вещь, о которой нужно беспокоиться.


теперь вы можете задаться вопросом, почему $_REQUEST все-таки существует и почему он не удаляется. Это было предложено на PHP внутрикорпусных устройств, а также. Цитируя Расмуса Лердорфа о почему существует $_REQUEST? на PHP Internals

чем больше таких вещей мы удаляем, тем труднее становится людям быстро перейти к новой, более быстрые и безопасные версии PHP. Что вызывает гораздо больше разочарования для всех, чем несколько "уродливых" наследия особенности. Если есть достойная техническая причина, производительность или безопасность, тогда нам нужно внимательно посмотреть на это. В этом случае то, что мы должны смотреть, - это не следует ли нам удалить $_REQUEST но должны ли мы удалить данные cookie от него. Многие конфигурации уже сделайте это, включая все мои собственные, и есть сильный действительный из соображений безопасности не в том числе куки в $_REQUEST. Большинство людей используют $_REQUEST означает GET или POST, не понимая, что он также может содержать печенье и как такие плохие парни потенциально могут сделать инъекцию печенья хитрости и ломают наивные приложения.

в любом случае, надеюсь, что это прольет свет.

$_REQUEST относится ко всем видам запросов (GET, POST и т. д..). Это иногда полезно, но обычно лучше указать точный метод ($_GET, $_POST и т. д.).

$_REQUEST обычно считается вредным по той же причине, что преобразования данных простой и средней сложности часто выполняются в коде приложения вместо объявленных в SQL: некоторые программисты сосут.

как таковой, если вы склонны использовать $_REQUEST везде, я могу сделать что-нибудь через GET, что я мог бы через POST, что означает настройку <img> теги на моем (вредоносном) сайте, которые заставляют пользователей, вошедших в ваш модуль электронной коммерции, покупать продукты молча, или я могу вызвать их кликают по ссылкам, которые приведут к опасным действиям или раскрытию конфиденциальной информации (вероятно, для меня).

однако это происходит из-за того, что Новичок или, по крайней мере, неопытный программист PHP делает простые ошибки. Во-первых, знать, когда данные какого типа подходит. Например, у меня есть веб-служба, которая может возвращать ответы в URLEncoding, XML или JSON. Приложение решает, как отформатировать ответ, проверяя заголовок HTTP_ACCEPT, но может быть принудительно в частности, путем направления

запросы GET должны быть идемпотентными, а запросы POST, Как правило, нет. Это означает, что данные в $_GET и $_POST обычно следует использовать по-разному.

Если ваше приложение использует данные из $_REQUEST, он будет вести себя одинаково для запросов GET и POST, что нарушает идемпотентность GET.

Это расплывчато. Ты же не действительно знать, как данные попали к вам, так как он несет post, get и cookie данных. Я не обязательно думаю, что это всегда плохо, если вы нужно знать или ограничивать способ доставки.

Мне действительно нравится его использовать. Это дает вам гибкость в использовании GET или POST, которые могут пригодиться для таких вещей, как поисковые формы, где большую часть времени публикуются данные, но иногда вы хотите сказать ссылку на конкретный поиск, поэтому вы можете использовать параметры GET вместо этого.

кроме того, если вы посмотрите на многие другие языки (ASP.NET например) они вообще не делают различий между переменными GET и POST.

ETA:

Я никогда не использовал Запрос на получение значений COOKIE, но я думаю, что Кайл Батт делает большой момент в комментариях к этому сообщению об этом. Это не очень хорошая идея, чтобы использовать запрос для получения значений COOKIE. Я считаю, что он прав, что есть некоторый реальный потенциал для подделки межсайтовых запросов, если вы это сделаете.

кроме того, порядок, в котором материал загружается в запрос, контролируется параметрами конфигурации в php.ini (variables_order и request_order). Итак, если у вас есть одна и та же переменная, переданная через оба POST и GET, который на самом деле попадает в запрос, зависит от этих настроек ini. Это может повлиять на переносимость, если вы зависите от определенного порядка, и эти параметры настроены иначе, чем вы ожидаете.

важно понимать, когда использовать POST, когда использовать GET и когда использовать cookie. С $_REQUEST значение, на которое вы смотрите, могло исходить от любого из них. Если вы ожидаете получить значение из сообщения или получить или из файла COOKIE, это более информативно для кого-то, кто читает ваш код, чтобы использовать определенную переменную вместо $_REQUEST.

кто-то еще указал также, что вы не хотите, чтобы все сообщения или куки были переопределены GETs, потому что есть разные межсайтовые правила для всех из них, например, если вы возвращаете данные ajax при использовании $_REQUEST, вы уязвимы для атаки межсайтового скрипта.

единственный раз с помощью $_REQUEST Это не плохая идея с GET.

  • если вы используете его для загрузки значений POST, вы рискуете подделками межсайтовых запросов
  • если вы используете его для загрузки значений cookie, вы снова рискуете подделка межсайтовых запросов

и даже с GET, $_GET короче, типа, чем $_REQUEST;)

Я мог бы использоваться только в том случае, если вы хотите получить текущий url или имя хоста, но для фактического анализа данных из этого URL, таких как парметры с использованием символа&, это, вероятно, не очень хорошая идея. В общем, вы не хотите использовать расплывчатое описание того, что вы пытаетесь сделать. Если вам нужно быть конкретным, это где $_REQUEST плохо, если вам не нужно быть конкретным, то не стесняйтесь использовать его. Я бы подумал.

Если вы знаете, какие данные вы хотите, вы должны явно указать это. IMO, GET и POST-это два разных животных, и я не могу придумать вескую причину, по которой вам когда-либо понадобится смешивать данные post и строки запроса. Если у кого-то есть, мне было бы интересно.

может быть удобно использовать $_REQUEST, когда ваши скрипты могут отвечать на GET или POST таким же образом. Я бы сказал, что это должно быть чрезвычайно редким случаем, и в большинстве случаев две отдельные функции предпочтительно обрабатывать две отдельные концепции или, по крайней мере, проверять метод и выбирать правильные переменные. Поток программы обычно намного легче следовать, когда нет необходимости перекрестно ссылаться на то, откуда могут поступать переменные. Будьте добры к человеку,который должен поддерживать ваш код в течение 6 месяцев. Это может быть ты.

в дополнение к проблемам безопасности и WTFs, вызванным файлами cookie и переменными среды в переменной запроса (не заставляйте меня начинать GLOBAL), рассмотрим, что может произойти в будущем, если PHP начал изначально поддерживать другие методы, такие как PUT и DELETE. Хотя крайне маловероятно, что они будут объединены в запрос superglobal, возможно, они могут быть включены как опция on в параметре variable_order. Таким образом, вы действительно понятия не имеете, что такое запрос и что имеет приоритет, особенно если ваш код развернут на стороннем сервере.

сообщение безопаснее, чем получить? Не реально. Лучше использовать GET where practical, потому что в ваших журналах легче увидеть, как ваше приложение используется, когда оно подвергается атаке. POST лучше подходит для операций, которые влияют на состояние домена, потому что пауки обычно не следуют за ними, а механизмы прогнозной выборки не удаляют все ваше содержимое при входе в ваш CMS. Однако вопрос был не о достоинствах GET vs POST, а о том, как получатель должен обрабатывать входящие данные и почему его плохо объединить, так что это это действительно просто кстати.

Я думаю, что нет никаких проблем с $_REQUEST, но мы должны быть осторожны при его использовании, так как это набор переменных из 3 источников (GPC).

Я думаю $_REQUEST по-прежнему доступен, чтобы сделать старые программы совместимыми с новыми версиями php, но если мы начнем новые проекты (включая новые библиотеки), я думаю, что мы не должны использовать $_REQUEST больше, чтобы сделать программу понятнее. Мы должны даже рассмотреть возможность удаления использования $_REQUEST и заменить его на функцию-оболочку, чтобы сделать программу легче, особенно при обработке больших представленных текстовых данных, так как $_REQUEST содержит копии $_POST.

// delete $_REQUEST when program execute, the program would be lighter 
// when large text submitted
unset($_REQUEST);

// wrapper function to get request var
function GetRequest($key, $default = null, $source = '') 
{
  if ($source == 'get') {
    if (isset($_GET[$key])) { 
      return $_GET[$key]; 
    } else { 
      return $default; 
    }
  } else if ($source == 'post') {
    if (isset($_POST[$key])) { 
      return $_POST[$key]; 
    } else { 
      return $default; 
    }
  } else if ($source == 'cookie') {
    if (isset($_COOKIE[$key])) { 
      return $_COOKIE[$key]; 
    } else { 
      return $default; 
    }
  } else {
    // no source specified, then find in GPC
    if (isset($_GET[$key])) {
      return $_GET[$key];     
    } else if (isset($_POST[$key])) {
      return $_POST[$key]; 
    } else if (isset($_COOKIE[$key])) {
      return $_COOKIE[$key]; 
    } else {
      return $default; 
    } 
  }
}

Даррен Кук: " начиная с php 5.3 php по умолчанию.ini говорит, что только GET и POST данные помещаются в $_REQUEST. См.php.net/request_order я просто наткнулся на этот разрыв обратной совместимости при ожидании cookie данные должны быть в $_REQUEST и интересно, почему он не работает!"

Вау... просто некоторые из моих скриптов перестали работать из-за обновление до PHP 5.3. Сделал то же самое: предположим, что куки будут установлены при использовании $_REQUEST переменной. С обновлением именно это перестало работать.

теперь я вызываю значения cookie отдельно с помощью $_COOKIE["Cookie_name"]...

Это очень небезопасно. Также это неудобно, так как вы не знаете, получаете ли Вы сообщение или GET, или другой запрос. Вы действительно должны знать разницу между ними при разработке приложений. GET очень небезопасен, поскольку он передается по URL-адресу и не подходит почти ни для чего, кроме навигации по страницам. Почта, хотя и не безопасна сама по себе, обеспечивает один уровень безопасности.