Динамические названия полей для защиты форм от глупых роботов

Имеем форму для логина с полями - имя, пароль. Имеем робота, который хочет подобрать пароль. Чтобы замедлить его работу - мы (с позиции владельца белого пушистого сайта) можем сделать так, чтобы на максимальное количество попыток проверки пароля было минимальное количество реальных случаев проверки пароля. Мы не будем утверждать, что с нашей формой нельзя будет "работать" умному роботу :) но мы можем максимально усложнить жизнь глупым роботам.
Что делаем - во-первых используем сессии, например:
ini_set("session.use_only_cookies", 1);
session_name("s");
session_start();
В результате получаем относительно случайно выбранный идентификатор сессии. Он принудительно хранится в куках браузера (use_only_cookies=1), однако нам это подходит, т.к. у людей в основном куки браузера включены, а у роботов не всегда ;) . Его (идентификатор сессии) мы можем использовать для генерации имен полей, например при помощи функции однонаправленного хеширования.

function form_field($name)
{
return ( "_" . md5($name . session_id()) );
}

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

Код формы будет выглядеть примерно так:

<form action="login.php" method="post">
Логин: <input type="text" name="<?=form_field('login') ?>" value="" />
Пароль: <input type="password" name="<?=form_field('pass') ?>" />
<input type="submit" value="Вход" />
</form>

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

function check_pass()
{
$result = false;
$flogin = form_field("login");
$fpass = form_field("pass");
if ( isset($_POST[$flogin]) && isset($_POST[$fpass]) )
{
$login = $_POST[$flogin];
$pass = $_POST[$fpass];

... далее идет проверка правильности значений в $login и $pass ...
}

}
Непосредственно проверку обсуждать не будем - тут есть различные варианты (чтение списка пользователей из файла, из БД, запрос на авторизацию через сетевое соединение и т.д.).

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

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

· Добавьте на news2.ru

Похожие записи:


5 Комментариев »

  1. Dennion said,

    Октябрь 18, 2006 @ 20:44

    Я обычно делаю проверку “Каптчу”, правда она меня иногда самого доводит до белого колени, но в рамках спецзащиты, мне кажется это самая реальная защита от “злых ботов”. Самая конечно простая это проверка реферера $HTTP_REFERER, у ботов их нет. Ну если это умный бот, ходящий через сокеты, то тут уже каптча его добьет.

  2. Dennion said,

    Октябрь 18, 2006 @ 20:49

    Да еще класная штука это GEOIP. Смысл ее в том, что она выдает страну прокси бота (пользователя) по его IP, можно просто задать страны, например RU,KZ,UA с которых возможна аунтификация. Остальных всех побоку, кому нужно, могу развить тему :) . Еще бы хорошо иметь черный список IP злостных взломщиков, т.е. вести журнал входа в админку.

  3. Mikhail said,

    Октябрь 18, 2006 @ 21:01

    2Dennion: HTTP_REFERER подделывается первым делом даже детскими ботами :) см. режимы функции curl_setopt().
    По поводу ограничения стран - достаточно сделать список подсетей, из которых можно заходить, можно без геоип.

  4. Dennion said,

    Октябрь 18, 2006 @ 21:08

    У каждого свои секреты :) , меня просто бот парил отправкой сообщения с сайта, простой проверкой HTTP_REFERER послал его заслуги в корзину. С курлом особо не работал, не могу поддержать идею, знаю что она очень редко где встречается (поддержка).

  5. Mikhail said,

    Октябрь 18, 2006 @ 21:10

    Поддержка курла? есть на любом нормальном хостинге :)

RSS feed for comments on this post · TrackBack URI.

Прокомментируйте