Как безопасно читать суперглобальный PHP $ _REQUEST? - PullRequest
0 голосов
/ 22 августа 2009

Я пытаюсь прочитать параметры получения таким образом, чтобы не открылись потенциальные проблемы безопасности.

Я думал, что параметр запроса явно сопоставлялся с тем, что я ожидал, а затем устанавливал значение по умолчанию для всего, что не соответствует.

Например:

if ($_REQUEST['media'] == "video")
    $sort = "video";
elseif ($_REQUEST['media'] == "audio")
    $sort = "audio";
else
    $sort = "both";

Этого достаточно или необходимы дальнейшие шаги?

Ответы [ 6 ]

5 голосов
/ 22 августа 2009

Вероятно, также стоит отметить (если вы беспокоитесь о безопасности), что не очень хорошо знать, откуда поступают ваши данные. Возможно, вам следует либо использовать $ _GET, $ _POST или $ _SESSION в зависимости от способа доставки.

5 голосов
/ 22 августа 2009

То, что вы упоминаете, безопасно, но слишком многословно. Использование операций с массивами PHP позволит PHP справиться с грязной работой за вас:

$sort_valid = array('video', 'audio', 'both');
$sort = 'both'
if (isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) {
    $sort = $_REQUEST['media'];
}

Если этот вид суперглобального синтаксического анализа встречается повсеместно в вашем коде, вы можете абстрагировать его в функцию, которая обрабатывает его для вас (как это делают многие крупные PHP-проекты).


Как отметил Гэвин, это также хорошая идея, если это вообще возможно, использовать интересующий вас суперглобал (то есть $_GET, $_POST или $_COOKIE). Сейчас это может показаться не важным, но некоторые уродливые ошибки могут быть скрыты от конфликтов имен. Между тремя суперглобалами могут возникнуть конфликты (например, sort в $_COOKIE может относиться к сортировке результатов поиска по умолчанию, но sort в $_GET относится в порядке возрастания или убывания).

1 голос
/ 22 августа 2009

Убедитесь, что вы знаете, откуда поступают данные, это лучший способ.
// мы не принимаем метод GET, поэтому мы устанавливаем $ media null
// если метод равен post, мы анализируем в int, поэтому, что бы ни приходило в $ _post,
// он не будет анализироваться в строковом режиме, и нам не нужно проверять наличие SQL-запросов.

(isset($_GET['media']))? $media='': $media=(int)(isset($_POST['media'])) ? $_POST['media'] : '';

switch ($media) {
    case 1: $sort = "video"; break;
    case 2: $sort = "audio"; break;
    default: $sort = "both"; break;
}



кстати, вы можете прочитать о $ _SERVER ['REQUEST_METHOD']

// мы используем метод POST в форме, поэтому ...

Заголовок if ($ _SERVER ['REQUEST_METHOD'] == "GET") ('Местоположение: http://www.disney.com/');

1 голос
/ 22 августа 2009
$valid = array("media" => array("both", "media", "video"), ... );
$default = array("media" => "both", ...);

...

// 1. drop invalid keys
$filtered_on_keys = array_key_intersect($_REQUEST, $valid);

// 2. drop invalid values
$filtered_on_values = array();

foreach($filtered_on_keys as $key => $value) {
  if (array_search($value, $_REQUEST($key) !== FALSE) {
    $filtered_on_values[$key] = $value;
  }
}

// 3. add missing defaults
$result = array_merge($defaults, $filtered_on_values);
1 голос
/ 22 августа 2009

Самый простой способ будет:

$sort='both';
$sort_valid = array('video', 'audio');
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media'];
1 голос
/ 22 августа 2009

Я бы добавил еще одно условие:

    $sort = "both";
    if (array_key_exists('media', $_REQUEST))
    {
        if ($_REQUEST['media'] == "video")
            $sort = "video";
        elseif ($_REQUEST['media'] == "audio")
            $sort = "audio";
    }

И да, суперглобальный $ _REQUEST - рекомендуемый способ прочитать запрос.

...