В последнее время в Интернете все чаще можно встретить разнообразных спам-ботов, которые не только автоматически регистрируются, но и добавляют спам-сообщения на форумах, в комментариях и т.п.
Действия ботов могут так же привести к более серьезным последствиям. Представьте что у вас есть форма, которая заносит данные в базу данных после ее отправки, и что может произойти, если в одно мгновение форму автоматически заполнят и отправят тысячи и десятки тысяч роботов.
Очень часто возникает необходимость защиты от таких ботов. Как правило, в основном защита организуется в виде какого то дополнительно параметра, который должен быть введен в одно из полей формы, и который бот никак не сможет определить. Это реализуется при помощи картинки с буквами или цифрами (или и тем и другим одновременно) через сессии или через ip посетителей. В данной статье я помогу вам разобраться как сделать такую картинку при помощи php и mysql в считанные минуты.
Для начала создадим небольшую таблицу базы данных, в которой будут временно храниться ip посетителей и значения цифр, изображенных на картинке:
CREATE TABLE test ( IP char(15) NOT NULL, Number char(3), PRIMARY KEY(IP))
Тип поля Number указывает, что у нас будут выводится по три цифры на каждой картинке.
Пусть у нас есть некая форма, корорая отправляет данные странице ok.php. Часть кода страницы, на которой расположенна форма будет выглядить следующим образом.
<?php $ip = $_SERVER[REMOTE_ADDR]; for ($i=0; $i<3; $i++) $x=$x.mt_rand(1,9); echo <img src=pic.php?text=.$x.>; @mysql_connect(localhost, login, pass) or die; @mysql_select_db(dbname) or die(Не удалось соединится с базой данных); mysql_query(INSERT INTO test VALUES(.$ip., .$x.)); ?> <input type=submit> </form>
На форме расположенны два поля для ввода данных (Имя и Текст) и поле для ввода значения цифр с картинки (которое имеет имя intext)
$ip = $_SERVER[REMOTE_ADDR];
Определяем ip посетителя страницы.
for ($i=0; $i<3; $i++) $x=$x.mt_rand(1,9);
При помощи функции mt_rand формируем три случайных числа от 1 до 9 и представляем их в виде строки $x.
echo <img src=pic.php?text=.$x.>;
Ключевая строка. Выводим собственно картинку цифрами. Код файла pic.php описан ниже.
@mysql_connect(localhost, login, pass) or die(Не удалось соединится с хостом базы данных); @mysql_select_db(dbname) or die(Не удалось соединится с базой данных); mysql_query(INSERT INTO test VALUES(.$ip., .$x.));
Соединяемся с базой данных и записываем ip и строку с цифрами в таблицу test.
<input type=submit> </form>
Рисуем кнопку отправки данных и закрываем форму :)
Из того, что вы должны знать в этом коде: $rgb - цвет фона картинки, $textcolor - цвет цифр, выводимых на картинке. Как вы заметили, формироваться будет изображение в формате GIF.
Теперь осталось последнее, обработка данных полученных в форме в файле ok.php (куда эти данные собственно и передаются).
Код файла ok.php:
<?php $ip = $_SERVER[REMOTE_ADDR]; @mysql_connect(localhost, login, pass) or die; @mysql_select_db(work2) or die; $res = mysql_query(SELECT number FROM test WHERE IP=.$ip.);
if (mysql_num_rows($res)==0) echo Вы не ввели цифры!; else { if (mysql_result($res,0,0)!=$intext) echo Вы ввели не правильные цифры; else echo ВСЕ ОК :); mysql_query(DELETE FROM test WHERE IP=.$ip.); }; ?>
Опять же, определяем ip пользователя и сравниваем, записан ли такой адрес в таблицу test. Если да, проверяем:
mysql_result($res,0,0)!=$intext
те ли цифры пользователь ввел в форму в текстовое поле intext, которые были отображены на картинке и записаны возле его ip адреса в базе данных. Вот и все :)
Единственное что можно добавить, что безусловно данный механизм не представляет собой идеал защиты. Например, пользователь может зайти на страницу с формой, скрипт запишет его айпи, а он возьмет и перегрузит страницу. Но в данной статье я не преследовал цель написать полноценный скрипт, а лишь хотел ознакомить вас с основным механизмом разработки подобной защиты.