четверг, 9 августа 2007 г.

PHP: методы защиты Вашего скрипта от ботов

Если на Вашем сайте есть формы, которые используются для отправки каких-либо текстовых данных пользователями (как то: гостевые книги, форумы, чаты, формы контактов), рано или поздно Вы столкнётесь со всяческими спам-ботами, которые будут в большом количестве отправлять в формы навязчивую рекламу сайтов их обладателей (ботов, имеется в виду). Есть множество методов, позволяющих предотвратить отправку данных ботами, и в этой статье я опишу несколько таких методов.

Метод #1: Генерация случайного session id

Самый простой, но довольно эффективный метод для избавления от спам-ботов.

Суть метода заключается в том, что в форму добавляется скрытое поле, содержащее случайным образом сгенерированную длинную последовательность символов. При отправке формы её обработчик проверяет session id, и, если он верен, то действие выполняется, если нет, то нет.

Сейчас я объясню, как это реализовать.

Итак, в PHP-код скрипта (в самое начало кода) вставляем несколько строчек:

session_start();
$sid = md5 (rand (100000, 999999));
$_SESSION['sid'] = $sid;


Первая строчка начинает сессию, вторая – генерирует случайную последовательность символов (32-х значную), а третья – сохраняет эту переменную в сессии.

Далее, в HTML-код формы вставляем следующую строчку (естественно, код должен находиться в этом же файле, или в подключаемом):

<input type="hidden" name="sid" value="<?php echo $sid; ?>">

Теперь в PHP-код обработчика вставляем несколько строчек (также, в самое начало кода):

session_start();
if ($_GET['sid'] != $_SESSION['sid']) $sid_error = true;
/* используйте $_POST['sid'] вместо $_GET['sid'] если Вы используете метод передачи POST */
else $sid_error = false;
session_destroy();


Первая и последняя строчки – открывают и уничтожают сессию, остальные – проверяют session id. Если id неправилен, то переменная sid_error имеет значение true, иначе – false. Обработка этой переменной лежит уже на Ваших плечах.

Метод #2: Визуальное подтверждение

В последнее время этот метод защиты от ботов становится всё менее эффективным и всё более раздражающим. Суть заключается в том, что для подтверждения операции пользователь должен ввести код «с картинки».

Данный метод не требует большого кода, но сейчас я обнаружил, что потерял код визуального подтверждения... Точнее, удалил (безвозвратно), поэтому, как реализовать данный метод, сейчас я рассказать не могу. Что ж, расскажу о других.

Метод #3: Текстовое подтверждение

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

Всё очень просто – пользователю показывается код, который он должен повторить. Чаще всего код цифровой, и иногда он записан буквами.

Как реализовать этот метод.

Для начала в PHP-код скрипта (в начало кода) вставляем следующий фрагмент:

session_start();
$confirm_num = rand (100, 999);
$_SESSION['confirm_num'] = $confirm_num;


В форму ввода вставьте такой код:

Введите число в поле справа: <input name="confirm_num" value="" type="text">

Теперь, в PHP-код обработчика вставляем такой код (не забываем о том, что код надо вставить в самое начало):

session_start();
if ($_SESSION['confirm_num'] != $_GET['confirm_num']) $conf_error = true;
/* используйте $_POST['confirm_num'] вместо $_GET['confirm_num'] если Вы используете метод передачи POST */
else $conf_error = false;
session_destroy();


Если код введён верно, то, как Вы наверное, догадались, conf_error имеет значение true, если неверно, то false.

Вроде бы всё, что я хотел рассказать, рассказал. Вообще существует ещё достаточное количество разных методов антибот-защиты (например, запись session id в cookies, проверка http-реферрера, и много ещё чего). Я рассказал только о тех, которые использую сам.

Надеюсь, мои советы помогут Вам противостоять армиям ботов.

Комментариев нет: