PHP ПОЛУЧАЮТ переменную инжекцию массива

Если Вы говорите GoF, Сувенир , шаблон конкретно обращается к отмене.

13
задан dave 11 December 2009 в 05:30
поделиться

7 ответов

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 или любую другую плохую идею, подобную этой) , риска кода нет - впрыск.

8
ответ дан 1 December 2019 в 22:07
поделиться

Если вы не знаете, как обезопасить , по крайней мере, вы можете отфильтровать массив $ _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 от подозрительных символов, таких как [].

6
ответ дан 1 December 2019 в 22:07
поделиться

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

Причина, по которой это работает, заключается в том, что PHP интерпретирует переменные, оканчивающиеся на [], как массивы. Поэтому, если вы предоставите несколько переменных GET с одинаковым именем, заканчивающимся на [], PHP создаст массив, содержащий все значения.

2
ответ дан 1 December 2019 в 22:07
поделиться
echo $_GET['a'][0]; //prints "asd"
echo $_GET['a'][1]; //prints "asdasd"
echo $_GET['b'][0]; //prints "$a"
2
ответ дан 1 December 2019 в 22:07
поделиться

Похоже, вы что-то неправильно поняли.

В приведенном выше примере просто создается массив вроде

Array (
  [a] => Array (
    [0] => asd
    [1] => asdasd
  )
  [b] => Array ( [0] => $a )
)

. Это задокументировано и работает точно так, как задумано.

1
ответ дан 1 December 2019 в 22:07
поделиться

Кто-то солгал вам, вы ничего не выполните с этим, вы просто отправите массив вместо простой переменной.

попробуйте этот код

<?php
    $x = $_GET['x'];
    var_dump($x);
?>

и получите доступ к нему, используя ? x = 1, а затем? x [a] = 1 & x [b] = 2 это ожидаемое поведение, а не инъекция, и вы не можете запускать с ним какой-либо код.

0
ответ дан 1 December 2019 в 22:07
поделиться

Короче говоря: без выполнения кода. Иначе не думаете ли вы, что кто-то уже взломал бы Facebook? :)

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

Дополнительную информацию можно найти на http://www.suspekt.org/

2
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: