Как защить форму от спама с помощью кода на картинке15.12.2007 сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьиВ наш век флуда и рекламы приходится защищаться от этой напасти. Если на вашем сайте есть форма для ввода данных, ее будут спамить роботы. Не важно, что это за форма, это может быть даже форма для поиска, роботы не будут разбираться для чего эта форма и будут спамить ее. Если будут спамить форму поиска, то это не страшно, а вот если роботы найдут форму регистрации пользователя, форму добавления ссылки в каталог, форму добавления комментария к статьям или новостям... То есть если на вашем сайте есть форма, которая принимает данные, а затем их сохраняет, вот такую форму надо защищать. Иначе, роботы очень быстро найдут вашу форму и вы просто устанете вычищать рекламно-флудный мусор. С каждым днем вы будете все больше и больше обнаруживать рекламных сообщений. Вот тут то и надо поставить проверку, человек добавляет данные или робот. Конечно и люди будут добавлять рекламные сообщения, но в сравнении с роботами, таких сообщений будет совсем мало. Итак, рассмотрим самый распространенный и надежный вариант проверки, человек заполняет форму или робот. Это генерация картинки с изображенным на ней кодом. Этот код вводится посетителем в форму вместе с остальными данными, а ваш скрипт должен проверить, правильно ли введен код. Если код правильный, тогда принимаем данные. Чтобы сделать такую проверку нужно: 1. Сформировать код из случайных символов, можно просто из случайных чисел. 2. Обязательно сохранить этот код на стороне сервера (в сессии, в базе или в файле), хранение кода в куках естественно не подходит. 3. Создать и показать изображение с этим кодом. 4. Принять этот код от посетителя и сверить сохраненный ранее код с присланным сейчас. 5. Если код верный, обязательно удалить сохраненный код и дать добро на добавление данных. Если код не верный, можно не удалять код и вывести его на изображении повторно, а можно и удалить и сформировать новый код. Это уже по вашему усмотрению. Начнем все по пунктам. 1. Формируем случайное число <? list($usec, $sec) = explode(' ', microtime()); mt_srand($sec * $usec); mt_rand(0, 1999); $code=mt_rand(0, 99999); ?> В переменной $code сейчас как раз нужное нам случайное число. 2. Теперь сохраним этот код в сессии <? session_start(); $_SESSION['webi_code']=$code; ?> 3. Создаем изображение с этим кодом. Для этого естественно потребуется библиотека GD <? $secImgBgColor = "F9FAFA"; $secImgFontColor = "000000"; $im = ImageCreate(70, 18) or die("Image create error!"); $bgcolor = imagecolorallocate($im, sprintf("%03d",hexdec(substr($secImgBgColor, 0,2))), sprintf("%03d",hexdec(substr($secImgBgColor, 2,2))), sprintf("%03d",hexdec(substr($secImgBgColor, 4,2)))); $fontcolor = imagecolorallocate($im, sprintf("%03d",hexdec(substr($secImgFontColor, 0,2))), sprintf("%03d",hexdec(substr($secImgFontColor, 2,2))), sprintf("%03d",hexdec(substr($secImgFontColor, 4,2)))); ImageString($im, 5, 8, 1, $code, $fontcolor); Header("Content-Type: image/jpeg"); header("Cache-control: no-cache, no-store"); imagejpeg($im,"",75); ?> Вот основная часть выполнена. Предположим, что эта картинка с кодом была показана в форме и посетитель ввел в соответствующее поле эти цифры. 4. Теперь проверяем код присланный формой. $post_code у нас будет код, который пришел из формы, тот самый код, который ввел посетитель. <? session_start(); if($_SESSION['webi_code']==$post_code) { // если код совпал, удаляем код из сессии и добавляем данные из формы $_SESSION['webi_code']=""; ... } else { // а вот если код не совпал, то добавлять данные из формы не будем. // можно вывести какое-то сообщение, что число не верное // и можно снова загрузить форму } ?> Вот такой вот простенький пример. Сейчас покажу более конкретный вариант, с демонстрацией самой формы. <? if(isset($_GET['webi_code'])) { list($usec, $sec) = explode(' ', microtime()); mt_srand($sec * $usec); mt_rand(0, 1999); $code=mt_rand(0, 99999); session_start(); $_SESSION['webi_code']=$code; $secImgBgColor = "F9FAFA"; $secImgFontColor = "000000"; $im = ImageCreate(70, 18) or die("Image create error!"); $bgcolor = imagecolorallocate($im, sprintf("%03d",hexdec(substr($secImgBgColor, 0,2))), sprintf("%03d",hexdec(substr($secImgBgColor, 2,2))), sprintf("%03d",hexdec(substr($secImgBgColor, 4,2)))); $fontcolor = imagecolorallocate($im, sprintf("%03d",hexdec(substr($secImgFontColor, 0,2))), sprintf("%03d",hexdec(substr($secImgFontColor, 2,2))), sprintf("%03d",hexdec(substr($secImgFontColor, 4,2)))); ImageString($im, 5, 8, 1, $code, $fontcolor); Header("Content-Type: image/jpeg"); header("Cache-control: no-cache, no-store"); imagejpeg($im,"",75); ImageDestroy($im); } else { session_start(); if(isset($_SESSION['webi_code']) AND ($_SESSION['webi_code']==$_POST['code'])) { print "код правильно введен"; } else { print "ошибка кода"; } ?> <form method=post> <input type=text name="code" value="" size=16 maxlength=100><br> <input type=submit name=ok value="ок"> <img src="?webi_code=1"> </form> <? } exit; ?> Запускайте этот вариант и он будет работать. Чтобы упростить все, я тут использовал очень неординарный подход (сам удивился, что это работает). Форма и вывод картинки находятся в одном файле и чтобы определить, что выводить, картинку или форму будем картинку вызывать с параметрами. То есть классически картинку можно вызвать так <img src="file.php?webi_code=1"> , но так как я не знаю какое имя будет у вашего файла, я вызвал картинку так <img src="?webi_code=1"> То есть указал только параметры без имени файла. В html такой подход подразумевает вызов того же самого файла, который запущен сейчас. Полностью рабочий вариант и такой подход в создании картинки можно использовать на практике НО... Код выводится в чистом виде и любой элементарный распознаватель текста увидит эти цифры. Конечно, больше вреда приносят мелкие роботы, не способные читать тексты с картинки, но более навороченный робот уже распознает код. Чтобы защититься и от них, нужно набросать на картинку мусор. Например, линии, добавить шум, исказить, вобщем сделать код на картинке плохо читаемым. Я не буду вдаваться в тонкости, как сделать такие картинки. Лучше я вам предложу свою функцию, в которую я надергал несколько вариантов картинок из интернета. Функция умеет создавать два вида картинок, с использованием GD и без использования GD. Хранить код умеет в файлах, сессиях или базе. Как настроить функцию читайте на странице описания этой функции. Разобраться в этой функции проблем не составит, можете ее дорабатывать под свои нужды, а можете пользоваться готовой.
Вот тут находится эта функция Функция для защиты форм от спама картинкой
Комментарии
RSS комментарии
Добавить свой комментарий
|