Динамические названия полей для защиты форм от глупых роботов
Имеем форму для логина с полями - имя, пароль. Имеем робота, который хочет подобрать пароль. Чтобы замедлить его работу - мы (с позиции владельца белого пушистого сайта) можем сделать так, чтобы на максимальное количество попыток проверки пароля было минимальное количество реальных случаев проверки пароля. Мы не будем утверждать, что с нашей формой нельзя будет "работать" умному роботу
но мы можем максимально усложнить жизнь глупым роботам.
Что делаем - во-первых используем сессии, например:
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
Похожие записи:
- Яндекс дарит
деньгиигрушки - По следам Аякса, часть 2
- Веяние времени в привлечении клиентов
- Новые идеи вашей жизни
- Настраиваем DNS сервер на базе BIND



Dennion said,
Октябрь 18, 2006 @ 20:44
Я обычно делаю проверку “Каптчу”, правда она меня иногда самого доводит до белого колени, но в рамках спецзащиты, мне кажется это самая реальная защита от “злых ботов”. Самая конечно простая это проверка реферера $HTTP_REFERER, у ботов их нет. Ну если это умный бот, ходящий через сокеты, то тут уже каптча его добьет.
Dennion said,
Октябрь 18, 2006 @ 20:49
Да еще класная штука это GEOIP. Смысл ее в том, что она выдает страну прокси бота (пользователя) по его IP, можно просто задать страны, например RU,KZ,UA с которых возможна аунтификация. Остальных всех побоку, кому нужно, могу развить тему
. Еще бы хорошо иметь черный список IP злостных взломщиков, т.е. вести журнал входа в админку.
Mikhail said,
Октябрь 18, 2006 @ 21:01
2Dennion: HTTP_REFERER подделывается первым делом даже детскими ботами
см. режимы функции curl_setopt().
По поводу ограничения стран - достаточно сделать список подсетей, из которых можно заходить, можно без геоип.
Dennion said,
Октябрь 18, 2006 @ 21:08
У каждого свои секреты
, меня просто бот парил отправкой сообщения с сайта, простой проверкой HTTP_REFERER послал его заслуги в корзину. С курлом особо не работал, не могу поддержать идею, знаю что она очень редко где встречается (поддержка).
Mikhail said,
Октябрь 18, 2006 @ 21:10
Поддержка курла? есть на любом нормальном хостинге