<rmcreative>

RSS

PHP, валидация и массивы

2 ноября 2009

Наверное, многие сталкивались с задачей ввода произвольного числа одноимённых полей через форму. В PHP это сделано довольно удобно: в форме к имени поля добавляется [] и на стороне сервера в $_POST, $_GET или $_REQUEST мы получаем уже массив.

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

http://example.com/list.php?q=test
http://example.com/list.php?q[]=test

Довольно безобидный код, в котором нет проверки:

$q = null;
if(!empty($_GET['q'])) {
  $q = $_GET['q'];
}
// тут начинаем работать с $q как со строкой

А вот менее безобидный пример: в WordPress до версии 2.8.4 можно было таким вот образом сгенерировать новый пароль администратора без отсылки ему каких-либо писем.

Комментарии RSS

  1. №1962
    Karsonito
    Karsonito 03 нояб. 2009 г., 13:07:20

    Как говорится, "проблема в ДНК".

    Неважно как пришли данные. Если автор делает запрос

    SELECT * FROM $wpdb->users WHERE user_activation_key = %s

    То это уже о многом говорит. Даже если проверки и надежные.

    WP постоянно ломали и будут ломать.

  2. №1978
    CharnaD
    CharnaD 06 нояб. 2009 г., 23:51:30

    Неправильно проверять строку с помощью empty, потому что

    $str = "0";

    var_dump(empty($str));

    true.

  3. №1982
    Sam
    Sam 07 нояб. 2009 г., 17:44:45

    Это неправильно только если нам нужен «0».

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.