Если Вы говорите GoF, Сувенир , шаблон конкретно обращается к отмене.
PHP проанализирует строку запроса и вставит эти значения в суперглобальный массив $ _ GET
(то же самое для $ _ POST
, если это было сделано в форме с использованием POST, кстати) .
В вашем случае массив $ _ GET
будет содержать следующее:
array
'a' =>
array
0 => string 'asd' (length=3)
1 => string 'asdasd' (length=6)
'b' =>
array
0 => string '$a' (length=2)
Каждое значение, переданное в строке запроса, будет помещено PHP в массиве $ _ GET
, при необходимости создавая подмассивы, когда в строке запроса используется []
.
Но это не вызывает никакого «выполнения кода»: как пока вы правильно работаете с вводом (т.е. не доверяете вводу и используете на нем eval
или любую другую плохую идею, подобную этой) , риска кода нет - впрыск.
Если вы не знаете, как обезопасить , по крайней мере, вы можете отфильтровать массив $ _GET. Вот функция:
function filter_url($url)
{
if (is_array($url))
{
foreach ($url as $key => $value)
{
// recurssion
$url[$key] = filter_url($value);
}
return $url;
}
else
{
// remove everything except for a-zA-Z0-9_.-&=
$url = preg_replace('/[^a-zA-Z0-9_\.\-&=]/', '', $url);
return $url;
}
}
Теперь вы можете фильтровать $ _GET следующим образом:
$_GET = filter_url($_GET);
Это существенно очистит ваш массив $ _GET от подозрительных символов, таких как [].
Вышеупомянутое не строго разрешает выполнение кода, но может изменить поток управления вашего существующего кода, если не учитывает тот факт, что данные могут быть массивом.
Причина, по которой это работает, заключается в том, что PHP интерпретирует переменные, оканчивающиеся на [], как массивы. Поэтому, если вы предоставите несколько переменных GET с одинаковым именем, заканчивающимся на [], PHP создаст массив, содержащий все значения.
echo $_GET['a'][0]; //prints "asd"
echo $_GET['a'][1]; //prints "asdasd"
echo $_GET['b'][0]; //prints "$a"
Похоже, вы что-то неправильно поняли.
В приведенном выше примере просто создается массив вроде
Array (
[a] => Array (
[0] => asd
[1] => asdasd
)
[b] => Array ( [0] => $a )
)
. Это задокументировано и работает точно так, как задумано.
Кто-то солгал вам, вы ничего не выполните с этим, вы просто отправите массив вместо простой переменной.
попробуйте этот код
<?php
$x = $_GET['x'];
var_dump($x);
?>
и получите доступ к нему, используя ? x = 1, а затем? x [a] = 1 & x [b] = 2 это ожидаемое поведение, а не инъекция, и вы не можете запускать с ним какой-либо код.
Короче говоря: без выполнения кода. Иначе не думаете ли вы, что кто-то уже взломал бы Facebook? :)
Я думаю, что человек, который сказал вам, был сбит с толку некоторыми другими ошибками, которые использовали глубокую вложенность массивов для запуска переполнения буфера / двойного освобождения / какого-либо другого вектора взлома, который теоретически мог бы использоваться для выполнения некоторого кода. Это программные ошибки, которые вы можете наблюдать каждый день во многих популярных программах. Обычно их исправляют быстро.
Дополнительную информацию можно найти на http://www.suspekt.org/