PHP Injection из данных HTTP GET, используемых в качестве значения ключа массива PHP - PullRequest
4 голосов
/ 08 сентября 2011

Я хотел бы знать, существует ли возможная инъекция кода (или любой другой риск для безопасности, такой как чтение блоков памяти, которые вы не должны были делать и т. Д.) В следующем сценарии, где неанизированные данные из HTTP GET используется в коде PHP в качестве KEY массива.

Это должно преобразовать буквы в алфавитном порядке. от a до 1, от b до 2, от c до 3 .... HTTP GET переменная "letter" должна иметь значения букв, но, как вы понимаете, все, что угодно, может быть отправлено на сервер:

HTML:

http://www.example.com/index.php?letter=[anything in here, as dirty it can gets]

PHP:

$dirty_data = $_GET['letter'];

echo "Your letter's order in alphabet is:".Letter2Number($dirty_data);

function Letter2Number($my_array_key)
{
    $alphabet = array("a" => "1", "b" => "2", "c" => "3");

    // And now we will eventually use HTTP GET unsanitized data
    // as a KEY for a PHP array... Yikes!

    return $alphabet[$my_array_key]; 

}

Вопросы:

  1. Видите ли вы какие-либо угрозы безопасности?
  2. Как я могу санировать данные HTTP, чтобы иметь возможность использовать их в коде в качестве KEY массива?
  3. Насколько плоха эта практика?

Ответы [ 3 ]

7 голосов
/ 08 сентября 2011

Я не вижу никаких проблем с этой практикой. Все, что вы ... ошибаетесь ... получаете от $_GET, является строкой. Он не будет представлять никакой угрозы безопасности, если вы не позвоните на него eval(). Любая строка может быть использована в качестве ключа массива PHP, и она не будет иметь никаких негативных последствий (хотя, если вы используете действительно длинную строку, очевидно, это повлияет на использование памяти).

Это не похоже на SQL, где вы создаете исполняемый код ed позже - ваш PHP-код уже собран и исполняется ing , и единственный способ изменить его способ его выполнения во время выполнения заключается в вызове eval() или include() / require().

EDIT

Думая об этом, есть пара других способов, кроме eval() и include(), что этот ввод может повлиять на работу скрипта, и это использовать предоставленную строку для динамически вызывать функцию / метод, создавать объект или переменные переменные / свойства. Так, например:

$userdata = $_GET['userdata'];

$userdata();
// ...or...
$obj->$userdata();
// ...or...
$obj = new $userdata();
// ...or...
$someval = ${'a_var_called_'.$userdata};
// ...or...
$someval = $obj->$userdata;

... было бы очень плохой идеей, если бы вы делали это сначала с помощью дезинфекции $userdata.

Однако за то, что вы делаете, вам не нужно об этом беспокоиться.

3 голосов
/ 08 сентября 2011

Все внешние, полученные от GET, POST, FILE и т. Д., Должны рассматриваться как грязные и должным образом очищенные. Как и когда вы проводите санитарную обработку, зависит от того, когда будут использоваться данные. Если вы собираетесь сохранить его в БД, его необходимо экранировать (чтобы избежать SQL-инъекций. См., Например, PDO ). Экранирование также необходимо при запуске команды ОС на основе пользовательских данных, таких как eval или при попытке прочитать файл (например, чтение ../../../etc/passwd). Если он будет отображаться обратно пользователю, его необходимо закодировать (чтобы избежать внедрения html. См. Например, htmlspecialchars ).

Вам не нужно очищать данные так, как вы их используете выше. На самом деле, вы должны только бежать для хранения и кодировать для отображения, но в противном случае оставить данные необработанными. Конечно, вы можете выполнить свою собственную проверку данных. Например, вы можете захотеть, чтобы dirty_data был в списке [a, b, c], а если нет, отправьте его обратно пользователю. Тогда вам придется закодировать его.

Любая известная ОС не будет иметь проблем, даже если пользователь попытался прочитать неверный адрес памяти.

0 голосов
/ 08 сентября 2011
  1. Предположительно содержимое этого массива должно быть общедоступным, поэтому нет.
  2. Пройдите через array_key_exists()
  3. Возможно, по крайней мере, немного плохо. Может быть, есть что-то, что можно сделать с искаженной многобайтовой строкой, или что-то, что может вызвать какое-то переполнение на плохо сконфигурированном сервере ... но это чистое (невежественное) предположение с моей стороны.
...