2010-10-21 1 views
2

я разговаривал с одним из моих программистов раньше, и он показал мне кусок кода, он рассматривает:

foreach($_REQUEST as $var=>$val) { 
    $$var = addslashes($val); 
} 

Он хотел, чтобы иметь возможность использовать $varName вместо того, чтобы написать $_REQUEST['varName']

Я посоветовал ему использовать mysql_real_escape_string вместо addSlashes и не ставить $_REQUEST переменные на локальный стек, потому что дает хакерам присоединять вектор. Для меня это похоже на ту же проблему, что и в старой директиве REGISTER_GLOBALS.

Он сказал, что не было одинаковых угроз безопасности, поскольку все эти переменные были созданы в локальном стеке. Поэтому я был не уверен, и я проверил страницу переменных переменных PHP по адресу: http://www.php.net/manual/en/language.variables.variable.php, но не увидел ссылки на Super Globals и другой безопасности, кроме предупреждения.

Могут ли хакеры легко воспользоваться этой конструкцией?

+4

Похоже, что пришло время найти нового программиста! – mellowsoon

+0

Это очень плохо с точки зрения безопасности и дизайна. – rook

ответ

2

Это как поворот назад на 6 лет усовершенствований безопасности PHP ... В принципе, register_globals и magic_quotes собраны вместе! Эти два отмечены устаревшими в последних версиях PHP и будут удалены из будущих версий по очень веским причинам.

Представьте себе следующий код:

if ($is_admin) { 
    do_administrative_task(); 
} 

Теперь кто-то делает следующий запрос:

http://www.example.com/script.php?is_admin=1 

И так же, как это, вы админ!

Аналогичным образом, addslashes() действительно не обеспечивает защиту от атак SQL-инъекций, поскольку не понимает современные наборы символов. Смешно легко создать что-то, что обойдет addslashes() и pwn вашу базу данных.

2

Я не кодировал php в годах, но разве нет функции, которая делает это? Возможно, называется extract?

Существует несколько предупреждений об использовании этой функции с введенными пользователем данными. Эти предупреждения применимы и к вашему фрагменту кода.

0

Да. Если URL-адрес запроса содержит ...&GLOBALS[var]=1, он перезапишет соответствующую глобальную переменную.

Он должен, по крайней мере, рассмотреть следующие построить для обеспечения безопасности:

extract($_REQUEST, EXTR_PREFIX_ALL, "var_"); // or EXTR_SKIP 

Это даст локализованной переменные по крайней мере, префикс и предотвратить перезапись глобалов. Для хорошей меры также используйте array_map("addslashes", $_REQUEST) или более подходящую функцию экранирования. Но на самом деле это просто magic_quotes под другим именем. (Offtopic: попытайтесь отключить mysql_query и используйте PDO и подготовленные операторы, которые проще и безопаснее.)

1

«Локальный стек» не имеет к этому никакого отношения. Он по-прежнему позволяет любому создавать новую переменную в некоторой части кода, которую программист может не использовать.

Если он действительно хочет принять параметры запроса из $_REQUEST и сделать переменные их всех, то он должен передать только те, код будет не искать и не более.

И канава addslashes(). Это не только неправильное место для удаления входящих данных, но и неправильная функция.

0

Правильно так! В качестве программиста, на самом деле здесь есть три отдельных вопроса.

  1. Это $_REQUEST не более небезопасным, чем $_GET или $_POST, учитывая, что по умолчанию PHP $_COOKIES имеет приоритет над $_GET и $_POST.
  2. Установка значения суперглобала более безопасна, чем локальная переменная в локальной или локальной переменной объекта.
  3. Конечная пользовательская переменная в функции доступна на глобальном уровне.

Давайте начнем вверху.

  1. $_POST и $_GET не более безопасны, чем $_REQUEST. Вся информация, полученная от формы, загрязнена. Период. Несмотря на. Если я могу отправить в поддельные куки, я знаю, как подделать переменные POST. Аргумент спорный.
  2. Итак, мы берем локальную переменную, которую мы создаем с помощью $var. Область действия этой переменной находится только в функции/методе. Является ли настройка содержимого суперглобального значения предоставленным пользователем данным БОЛЕЕ безопасным, чем локальная переменная, которая очищается при очистке стека функций/методов? Интересно ...
  3. Давайте сниппета

 

function some_function() { 
    foreach($_POST as $var=>$val) { 
     $$var = $val; 
    } 
} 

Теперь, если $_POST содержит переменную _POST этот код установит локальную переменную $_POST, содержащую значение. Однако суперглобалы будут переопределять это, и любая ссылка на $_POST будет ссылаться на суперглобальную, а не на локальную переменную, и поэтому местный $_POST невосстанавливается. Учитывая эту функциональность PHP, без использования глобального ключевого слова, как правило, невозможно полностью переопределить суперглобальное