Безопасное программирование в PHP: маленькие хитрости
Февраль 10, 2008
Если вы не используете mod_rewrite в своих скриптах, то перед вами явно вставала проблема «санитаризации» массивов $_GET/$_POST/$_REQUEST.
Если не использовать принципов «виртуальной машины» в своих web-приложениях (данные хранятся не в отдельном хранилище, а обрабатываются по мере надобности) — наверняка следующая идея будет вам полезна.
В свое время мои скрипты были не очень «чистыми» — во многих классах одна и та же переменная получалась примерно так:
$id = intval($_GET['id']);
Очень скоро я понял, что повторная фильтрация данных — непозволительная роскошь. Конечно, это не относится к простым скриптам из 200-300 строк.
Вскоре я дошел до того, что данные лучше проверять и фильтровать только один раз. Решение простое, но эффективное
<?php
$_POST = sanitize($_POST);
$_GET = sanitize($_GET);
function sanitize($array)
{ foreach ($array as $id=>$value)
{ $array[$id] = mysql_real_escape_string($value);
}
return $array;
}
?>
После этого вы можете обращаться напрямую к элементам массива не заботясь о фильтрации. Конечно, это не панацея и не индульгенция на грехи-ошибки, но базовый уровень безопасности обеспечивают.
Февраль 12, 2008 в 19:58
Знаете, не соглашусь с вами. Во первых, чтобы работала mysql_real_escape_string, должно быть подключение к Mysql. Во вторых, более правильный принцип это фильтровать данные непосредственно перед использованием.
А так каждый раз mysql_real_escape_string обращается к mysql.
Февраль 12, 2008 в 20:28
небезопасно фильтровать весь ПОСТ и ГЕТ, т.к. размер его не известен, копируя входной массив 2 раза (параметр + форич).
предопределенные ключи отдельных фильтрованных хешей со своими правилами фильтрации смотриццо куда интересней)
Февраль 12, 2008 в 22:56
Anarki — полностью согласен по поводу доступа к mysql. То, что я не сказал о невозможности работы без подобной «фичи» — мое небольшое опущение
Максут, не увидел в своем коде 2 копирования. Элементы глобал.массивов заменяют сами себя — это раз.
Второе — передачу по ссылке еще не отменяли, вроде
Февраль 13, 2008 в 21:03
Идея правильная, но у реализации есть ряд минусов.
в частности плохо вписывается в принципы ООП.
я делаю по другому, параметры у меня передаются объектом, который рождает фабрика на основании глобальных переменных — соответственно в объекте остаются только те свойства которые меня интересуют (если страдать параноей можно и тоько правильных типов)
А эскейп стринг происходит непосредственно в момент вставки в бд.
Март 18, 2008 в 18:59
Я применяю фильтр почти такого типа уже более года, только намного сложнее этого и проблем не знаю. Я конечно не напишу его здесь, но могу добавить: а не лучше ли фильтровать один массив $_REQUEST, который, насколько мне известно включает в себя $_GET, $_POST, $_COOKIE ?
Март 18, 2008 в 22:23
$_REQUEST? Не боитесь об этом открыто говорить? Может, как-нибудь прочитать лекцию аудитории посетителей относительно «вредности» и небезопасности использования $_REQUEST в принципе?