Безопасное программирование в 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;
}
?>

После этого вы можете обращаться напрямую к элементам массива не заботясь о фильтрации. Конечно, это не панацея и не индульгенция на грехи-ошибки, но базовый уровень безопасности обеспечивают.

6 комментариев на “Безопасное программирование в PHP: маленькие хитрости”

  1. Anarki высказал:

    Знаете, не соглашусь с вами. Во первых, чтобы работала mysql_real_escape_string, должно быть подключение к Mysql. Во вторых, более правильный принцип это фильтровать данные непосредственно перед использованием.

    А так каждый раз mysql_real_escape_string обращается к mysql.

  2. Максут Газизов высказал:

    небезопасно фильтровать весь ПОСТ и ГЕТ, т.к. размер его не известен, копируя входной массив 2 раза (параметр + форич).

    предопределенные ключи отдельных фильтрованных хешей со своими правилами фильтрации смотриццо куда интересней)

  3. jeurey высказал:

    Anarki — полностью согласен по поводу доступа к mysql. То, что я не сказал о невозможности работы без подобной «фичи» — мое небольшое опущение :)

    Максут, не увидел в своем коде 2 копирования. Элементы глобал.массивов заменяют сами себя — это раз.

    Второе — передачу по ссылке еще не отменяли, вроде :)

  4. Seo-p высказал:

    Идея правильная, но у реализации есть ряд минусов.

    в частности плохо вписывается в принципы ООП.

    я делаю по другому, параметры у меня передаются объектом, который рождает фабрика на основании глобальных переменных — соответственно в объекте остаются только те свойства которые меня интересуют (если страдать параноей можно и тоько правильных типов)

    А эскейп стринг происходит непосредственно в момент вставки в бд.

  5. Ramires высказал:

    Я применяю фильтр почти такого типа уже более года, только намного сложнее этого и проблем не знаю. Я конечно не напишу его здесь, но могу добавить: а не лучше ли фильтровать один массив $_REQUEST, который, насколько мне известно включает в себя $_GET, $_POST, $_COOKIE ?

  6. Jeurey высказал:

    $_REQUEST? Не боитесь об этом открыто говорить? Может, как-нибудь прочитать лекцию аудитории посетителей относительно «вредности» и небезопасности использования $_REQUEST в принципе?