Что произойдет, если вы присвоите значение $ REQUEST?

недавно я наткнулся на эту строку в PHP-скрипте:

$_REQUEST['start_date']=$date;

можно ли или полезно каким-либо образом назначить что-то супер глобальной переменной $_REQUEST? Если есть $_COOKIE ['start_date'], это изменит значение cookie?

3 ответов


Да, это разрешено и может быть полезно по ряду причин.

  • отладка -- если, по какой-то причине вы хотите "навязать" определенный параметр запроса, вы можете установить значение в поле $_REQUEST, $_GET или $_POST массивы. Это переопределит любое значение, отправленное запрашивающей страницей, которое может потребоваться.
  • потому что вы собираетесь сделать что-то со всем массивом -- если вы хотите, например, json_encode все the $_REQUEST пары ключ-значение а также как некоторые дополнительные значения, может быть быстрее просто "добавить" значения в $_REQUEST таким образом, затем pass $_REQUEST to json_encode().

относительно вашего вопроса о $_COOKIE, нет, вы не можете изменить значение cookie, как только доступ к нему.

Примечание автора: следующий пример был добавлен в качестве предложенного и одобренного редактирования к моему исходному ответу. И хотя это может сработать, есть лучшие способы защитить ваш сайт от инъекционных атак (например,подготовленные заявления). ИМХО, благоразумный программист должен серьезно рассмотреть эти подходы, прежде чем полагаться на приведенный ниже код.

думаем о профилактике SQL-атаки на ваш сайт. Этот простой код остановит их для всех $_REQUEST переменные (пример mysqli):

function injectionwall($dbinterface)
{
    foreach($_REQUEST as $key => $data)
    {
        $_REQUEST[$key]=$dbinterface->real_escape_string($data);
    }
}

все $_REQUEST переменные теперь безопасны в использовании:)


Я думаю, что более подходящий ответ: "Да, это разрешено, но считают это плохой практикой, поэтому избегайте лучшего качества программирования".

Почему это разрешено (и, вероятно, смысл вашего вопроса):

  • Суперглобалы устанавливаются в начале выполнения программы, а затем не изменяются (если вы этого не сделаете). Таким образом, ваши изменения постоянны и легко видны в любой другой функции. Так что вперед, редактируйте как хотите.

но - почему лучше избегать:

  • обычно рекомендуется знать, каковы ваши переменные и откуда они берутся. Предположим, у вас есть функция, которая "делает безопасными" все ваши входы, манипулируя $_REQUEST. Когда вы начинаете использовать $_REQUEST, вы никогда не можете быть уверены, что ваша функция "Make safe" была запущена. При проведении модульного тестирования это становится особенно проблематичным. Если вы повторно назначите $_REQUEST другой переменной, вы можете легче отслеживать область этой переменной. Хотя вы делаете эту другую переменную "глобальной", тогда вы знаете, что она безопасна. (Недостаток, вы можете тратить память / программную мощность для некоторых чрезвычайно тяжелых приложений, но вы далеко от этого, если вы задаете этот вопрос.)

  • Если вы изменяете $_REQUEST, вы не редактируете $_POST, $_GET или $_COOKIE; это может привести к путанице, если вы хотите изменить свой код на $_POST как некоторое время в будущем (например, данные, которые вы думаете, что вы "сделали безопасным" не будет быть.)

наконец, две быстрые заметки об использовании $_REQUEST в целом:

  • $_REQUEST-это комбинация $_COOKIE, $_POST и $_GET (и $_FILES в более старых версиях). Но вы не знаете, что будет иметь приоритет, если вы не читаете php.ini файл -http://www.php.net/manual/en/ini.core.php#ini.variables-order. Поэтому не полагайтесь на $_POST, имеющий приоритет над $_GET!

  • еще одна причина использовать $_POST, $_GET или $_COOKIE, если вы можете: - это облегчает будущему разработчику отладку вашего кода, поскольку они знают, где вы ожидаете, что переменная придет. Но иногда это подходит для $_REQUEST, если вам действительно все равно, исходит ли значение из cookie, get или post.

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


разрешено или полезно каким-либо образом назначить что-то супер глобальная переменная $_REQUEST?

Да, это разрешено, но не полезно.

Если есть $_COOKIE ['start_date'], это изменит значение cookie?

нет, используйте setcookie http://php.net/manual/en/function.setcookie.php

все эти супер глобальные переменные просто простые глобальные массивы.