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 по email OK
Как говорится, "проблема в ДНК".
Неважно как пришли данные. Если автор делает запрос
SELECT * FROM $wpdb->users WHERE user_activation_key = %s
То это уже о многом говорит. Даже если проверки и надежные.
WP постоянно ломали и будут ломать.
Неправильно проверять строку с помощью empty, потому что
$str = "0";
var_dump(empty($str));
true.
Это неправильно только если нам нужен «0».