Что такое безопасный способ чтения суперкомплексов PHP $_REQUEST?

110
15

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


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


Например:


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

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

спросил(а) 2021-01-25T18:50:25+03:00 5 месяцев назад
1
Решение
109

То, что вы упомянули, безопасно, но слишком многословно. Использование операций массива 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 ссылается в порядке возрастания или убывания).

ответил(а) 2021-01-25T18:50:25+03:00 5 месяцев назад
108

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

ответил(а) 2021-01-25T18:50:25+03:00 5 месяцев назад
63

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


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

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

ответил(а) 2021-01-25T18:50:25+03:00 5 месяцев назад
63

$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);

ответил(а) 2021-01-25T18:50:25+03:00 5 месяцев назад
63

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


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

ответил(а) 2021-01-25T18:50:25+03:00 5 месяцев назад
63

Убедитесь, что вы знаете, откуда идут данные - это лучший способ.

// мы не принимаем метод GET, поэтому мы устанавливаем $media null

// если метод равен сообщению, мы анализируем int, поэтому whaterever приходит в $_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" ) header ('Местоположение: http://www.disney.com/');

ответил(а) 2021-01-25T18:50:25+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема