Защита от автоматической php

Защита от автоматической php

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

Исходные тексты можно скачать тут.

Вообще, с начала, меня посетила мысль ее перевода, но, во первых автор выбрал интересный, но не самый тривиальный вариант решения проблемы, а во вторых, мне бы вряд ли удалость сформулировать на русском языке такое обилие мыслей.

Последнее время, в связи с распространяющейся эпидемией спама, веб-мастера, стали все чаще и чаще прятать адреса своей электронной почты (E-Mail). Многие стали использовать формы обратной связи. Но как оказалось, такую защиту можно обойти. И уже на сегодняшний день, существует огромное количество программ, предназначенных для рассылки спама, через формы обратной связи.

Наша задача — сделать так, чтобы сообщение вам смог отправить только «живой человек». Чаще всего, для этого используют небольшие картинки, на которых выводится текст. Пользователя просят продублировать этот текст в поле ввода. Если дублирование производится неверно, то форма не обрабатывается.

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

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

Основной недостаток такого алгоритма заключается в том, что существующую «подложку» можно быстро вычислить. А после этого вычесть из изображения, которое необходимо распознать и таким образом получить картинку с чистым текстом. А для распознания такого текста уже сегодня существует масса программ.

Читайте также:  Time php hour and minute

Наша задача — сделать абсолютно случайную подложку, с текстом, который не то что распознать сложно, его прочитать тяжело.

Я бы предложил следующий алгоритм:

Создаем подложку (для этого можно использовать алгоритм построения фракталов)
Добавляем помехи — несколько случайных линий, цвета основного текста.
Выводим основной текст
Самое интересное — увеличиваем изображение в неровное количество раз — например, в 1.7, в 1.6
Уменьшаем изображение до оригинальных размеров

Увеличивать и уменьшать изображение необходимо с использованием сглаживания, иначе даже человек не сможет прочитать текста.

Если вам кажется, что рисовать фрактал слишком сложно, то можно нарисовать простую сетку.

При заходе пользователя на страницу с формой, мы создаем сессию и записываем в зарегистрированную переменную случайный код:
Код:

session_start(); session_register(«secret_number»); if (intval($_SESSION[«secret_number»])
Ваш E-Mail:

Введите код, который вы видите на картинке:

Скрипт, обрабатывающий данные, отправленные при помощи формы, должен работать примерно следующим образом:

session_start(); session_register("secret_number"); if ($_SERVER["REQUEST_METHOD"]=="POST") < $error=0; if ($_POST["secretcode"]!=$_SESSION["secret_number"] || intval($_POST["secretcode"])==0) $error=1; if ($error==0) < $_SESSION["secret_number"]=rand(1000,9999); // Выполняем необходимые действия с данными // .. print "Hello ".htmlspecialchars(StripSlashes($_POST["email"])); exit; >if ($error==1) print "Число с картинки введено неверно"; > // Выводим форму повторно // .
 header("Content-type: image/png"); // создаем изображение $im=imagecreate(101, 26); // Выделяем цвет фона (белый) $w=imagecolorallocate($im, 255, 255, 255); // Выделяем цвет для фона (светло-серый) $g1=imagecolorallocate($im, 192, 192, 192); // Выделяем цвет для более темных помех (темно-серый) $g2=imagecolorallocate($im, 64,64,64); // Выделяем четыре случайных темных цвета для символов $cl1=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128)); $cl2=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128)); $cl3=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128)); $cl4=imagecolorallocate($im,rand(0,128),rand(0,128),rand(0,128)); // Рисуем сетку for ($i=0;$i<=100;$i+=5) imageline($im,$i,0,$i,25,$g1); for ($i=0;$i<=25;$i+=5) imageline($im,0,$i,100,$i,$g1); // Выводим каждую цифру по отдельности, немного смещая случайным образом imagestring($im, 5, 0+rand(0,10), 5+rand(-5,5), substr($_SESSION["secret_number"],0,1), $cl1); imagestring($im, 5, 25+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],1,1), $cl2); imagestring($im, 5, 50+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],2,1), $cl3); imagestring($im, 5, 75+rand(-10,10), 5+rand(-5,5), substr($_SESSION["secret_number"],3,1), $cl4); // Выводим пару случайных линий тесного цвета, прямо поверх символов. // Для увеличения количества линий можно увеличить, // изменив число выделенное красным цветом for ($i=0;$i<8;$i++) imageline($im,rand(0,100),rand(0,25),rand(0,100),rand(0,25),$g2); // Коэффициент увеличения/уменьшения картинки $k=1.7; // Создаем новое изображение, увеличенного размера $im1=imagecreatetruecolor(101*$k,26*$k); // Копируем изображение с изменением размеров в большую сторону imagecopyresized($im1, $im, 0, 0, 0, 0, 101*$k, 26*$k, 101, 26); // Создаем новое изображение, нормального размера $im2=imagecreatetruecolor(101,26); // Копируем изображение с изменением размеров в меньшую сторону imagecopyresampled($im2, $im1, 0, 0, 0, 0, 101, 26, 101*$k, 26*$k); // Генерируем изображение imagepng($im2); // Освобождаем память imagedestroy($im2); imagedestroy($im1); imagedestroy($im); ?>

Вроде все. Если что-то, оставляйте комментарии.

Источник

Защита от автоматической регистрации при помощи картинки

В последнее время в Интернете все чаще можно встретить разнообразных спам-ботов, которые не только автоматически регистрируются, но и добавляют спам-сообщения на форумах, в комментариях и т.п.

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

Очень часто возникает необходимость защиты от таких ботов. Как правило, в основном защита организуется в виде какого то дополнительно параметра, который должен быть введен в одно из полей формы, и который бот никак не сможет определить. Это реализуется при помощи картинки с буквами или цифрами (или и тем и другим одновременно) через сессии или через ip посетителей. В данной статье я помогу вам разобраться как сделать такую картинку при помощи php и mysql в считанные минуты.

Для начала создадим небольшую таблицу базы данных, в которой будут временно храниться ip посетителей и значения цифр, изображенных на картинке:

CREATE TABLE test ( IP char(15) NOT NULL, Number char(3), PRIMARY KEY(IP))

Тип поля Number указывает, что у нас будут выводится по три цифры на каждой картинке.

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

 Имя:  
Текст:
Введите цифры на картинке: "; @mysql_connect('localhost', 'login', 'pass') or die; @mysql_select_db('dbname') or die("Не удалось соединится с базой данных"); mysql_query("INSERT INTO test VALUES('".$ip."', '".$x."')"); ?>

На форме расположенны два поля для ввода данных (Имя и Текст) и поле для ввода значения цифр с картинки (которое имеет имя intext)

Определяем ip посетителя страницы.

При помощи функции mt_rand формируем три случайных числа от 1 до 9 и представляем их в виде строки $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.

Рисуем кнопку отправки данных и закрываем форму 🙂

Из того, что вы должны знать в этом коде: $rgb — цвет фона картинки, $textcolor — цвет цифр, выводимых на картинке. Как вы заметили, формироваться будет изображение в формате GIF.

Теперь осталось последнее, обработка данных полученных в форме в файле ok.php (куда эти данные собственно и передаются).

Опять же, определяем ip пользователя и сравниваем, записан ли такой адрес в таблицу test. Если да, проверяем:

те ли цифры пользователь ввел в форму в текстовое поле intext, которые были отображены на картинке и записаны возле его ip адреса в базе данных. Вот и все 🙂

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

Источник

Оцените статью