PHP безопасно преобразовать массив $ _GET / $ _POST - PullRequest
1 голос
/ 16 января 2012

Я проверял свой скрипт на наличие уязвимостей и был шокирован тем, как я делал это раньше, что крайне небезопасно:

foreach ($_GET as $key => $value){
    $$key = $value;
}

или короче

extract( $_GET );

Я изменил с помощьюFirebug некоторые переменные POST / GET, чтобы соответствовать имени, которое я использовал в моем сценарии.они могут быть перезаписаны , если имя будет угадано правильно.

Так что я подумал, что мне нужно сделать это по отдельности, назвав это так: $ позволено_vars =

$allowed_vars = array("time","hotfile","netload","megaupload","user","pfda","xyz","sara","amount_needed");
    foreach ($_GET as $key => $value)
        {
             if (in_array($key,$allowed_vars))
                {
                    $$key = $value;
                }
        }

ЭтоСпособ экономит время, чем называя их по отдельности.

Какую автоматизацию следует использовать для этого?

Ответы [ 4 ]

4 голосов
/ 16 января 2012

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

Тем не менее, я использую какой-то подход из белого списка, похожий на ваш. но не для создания глобальных переменных из данных POST, а для добавления этих данных в SQL-запрос.

Как в этой простой вспомогательной функции для создания оператора SET:

function dbSet($fields) {
  $set='';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
    }
  }
  return substr($set, 0, -2); 
}

$id     = intval($_POST['id']);
$fields = explode(" ","name surname lastname address zip fax phone");
$query  = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id";
3 голосов
/ 16 января 2012

Вы можете сэкономить еще больше времени, не извлекая их вообще. Просто используйте их из массива $ _GET. Преимущества этого не только в том, чтобы избежать коллизий с переменными скрипта (или хуже), но также в том, что вам не нужно обновлять этот «автоматизм» при добавлении параметров запроса.

Когда я работаю с данными POST, например, из формы, я часто обрабатываю каждую явно:

$data = array();
$data['field1'] = someSaniFunction($_POST['field1']);
$data['field2'] = someOtherFunction($_POST['field2']);
...

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

0 голосов
/ 16 января 2012

Вы можете использовать функцию извлечения более безопасным способом:

extract($_REQUEST, EXTR_SKIP);

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

0 голосов
/ 16 января 2012

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

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

Например, у ZF есть объект запроса, и они рекомендуют использовать фильтр ввода при работе с этими данными: http://framework.zend.com/manual/en/zend.filter.input.html

...