Защитное изображение для HTML-формы
Для защиты от автоматической регистрации в HTML-форму добавляют изображение со случайной последовательностью цифр и букв, которые выводятся пользователю в виде динамического изображения. Одновременно в сессию помещается случайная последовательность цифр. Пользователь должен ввести код, который он видит на изображении, в текстовое поле. Если код совпадает с сохраненным в сессии, можно с большой долей вероятности сказать, что сайт просматривает человек, поскольку робот обычно не решает задачу распознавания образов.
// Ширина изображения
$width = 150;
// Высота изображения
$height = 50;
// Количество символов в коде
$sign = 5;
// Защитный код
$code = '';
// Стартуем сессию
session_start();
// Символы, используемые в коде
$letters = array('A','B','C','D','E','F','G','H','J','K','M','N',
'P','Q','R','S','T','U','V','W','X','Y','Z',
'2','3','4','5','6','7','8','9');
// Компоненты для RGB-цвета
$figures = array(70, 90, 110, 130, 150, 170, 190);
// Создаем пустое изображение
$img = imagecreatetruecolor($width, $height);
// Заливаем фон белым цветом
$fon = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $fon);
// Ширина поля под один символ
$letterWidth = intval((0.9*$width)/$sign);
// Заливаем фон точками
for($j=0; $j<$width; $j++) {
for($i=0; $i<($height*$width)/600; $i++) {
// Формируем случайный цвет
$color = imagecolorallocatealpha(
$img,
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
rand(10,30));
// Устанавливаем случайную точку случайного цвета
imagesetpixel($img, rand(0,$width), rand(0,$height), $color);
}
}
// Накладываем защитный код
for($i=0; $i<$sign; $i++)
{
//Рисуем
$color = imagecolorallocatealpha(
$img,
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
rand(10,30));
// Генерируем случайный символ
$letter = $letters[rand(0,sizeof($letters)-1)];
// Формируем координаты для вывода символа
if( empty($x) ) {
$x = intval($letterWidth*0.2);
} else {
if( rand(0,1) )
$x = $x + $letterWidth + rand(0, intval($letterWidth*0.1));
else
$x = $x + $letterWidth - rand(0, intval($letterWidth*0.1));
}
$y = rand( intval($height*0.7), intval($height*0.8) );
// Размер шрифта символа
$size = rand( intval(0.4*$height), intval(0.5*$height) );
// Угол поворота символа
$angle = rand(0, 30) - 15;
// Запоминаем символ в переменной $code
$code .= $letter;
// Выводим символ на изображение
imagettftext($img, $size, $angle, $x, $y, $color, "arialbd.ttf", $letter);
}
// Помещаем защитный код в сессию
$_SESSION['code'] = $code;
// Выводим изображение
header ("Content-type: image/jpeg");
imagejpeg($img);
?>
Скрипт позволяет создать изображение шириной $width и высотой $height пикселов, содержащее $sign случайных символов случайного цвета. Символы задаются массивом $letters, компоненты цвета — массивом $figures. После этого изображение заливается белым цветом, на котором размещаются в случайном порядке множество цветных пикселов, а затем генерируется и выводится случайный код $code. Переменная $code, помимо всего прочего, помещается в сессию, для того чтобы обработчик формы имел возможность сравнить введенный пользователем и сгенерированный коды. Так как данные из сессии не покидают сервер, злоумышленники не имеют возможности украсть защищенный код, сталкиваясь со сложной задачей распознавания образов.
Пример использования:
// Стартуем сессию
session_start();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Пример защиты формы</title>
</head>
<body>
<?php
if(isset($_POST['code']) && isset($_SESSION['code'])) {
if($_POST['code'] == $_SESSION['code'])
echo '<p style="color:green">Защитный код верен!</p>';
else
echo '<p style="color:red">Неверный защитный код!</p>';
unset( $_SESSION['code'] );
} else {
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post">';
echo '<img src="captcha.php" border="0" alt="" /><br/>';
echo '<input type="text" name="code" value="" /><br/>';
echo '<input type="submit" name="submit" value="Отправить" />';
echo '</form>';
}
?>
</body>
</html>
Ссылки по теме:
trias:
Не подскажете, как у Вас реализована защита от спама простыми цифрами, а не картинкой?
3 Октябрь 2008, 16:30Заранее спасибо.
admin:
trias, это не у меня реализовано, это плагин WordPress. Но в общем-то ничего сложного. Надо записать в файл несколько вопросов и правильных ответов:
3 Октябрь 2008, 17:13два плюс три|5
семь минус пять|2
четыре плюс пять|9
Когда формируем форму, выбираем из файла случайную запись, разделяем ее функцией explode(): $row[0] - это вопрос, который надо вывести в форме, а $row[1] - правильный ответ, который надо записать в сессию. Когда пользователь заполнит форму, мы в обработчике проверяем, совпадает ли значение, сохраненное в сессии, с тем, что ввел пользователь. Если совпадает - считаем, что это человек, если нет - значит робот.
Андрей:
Admin, напишите, пожалуйста, полностью этот скрипт, который у Вас реализован по защите от СПАМА. Я все понимаю, что Вы ответили Trias, но написать сам не могу. Не понимаю куда и как его вставлять. Вообщем очень много вопросов и мало ответов.
19 Март 2009, 16:29Андрей:
Ниже я привожу полный скрипт, который я сделал на основе ваших разработок, прочитав у Вас на сайте.
Появились проблемы:
19 Март 2009, 19:341) как сделать провеку, введен ли защитный код, по аналогии с полем “ИМЯ”, чтоб выдавалось предупреждение о заполнении данного поля.
2) не могу пока понять, как сделать проверку правильности самого кода. В данном варианте код только рисуется, но не проверяется. Я тыпался его встроить но пока не получилось.
3) если код не правильный, то как сделать сообщение об ошибки не стирая все введенные уже данные
4) Если можете напишите и встройте в мой скрипт Ваш код проверки, т.к. он мне больше нравится.
admin:
Андрей, давайте обсудим это на форуме.
24 Март 2009, 10:31Олег:
Здравствуйте, Евгений. На форуме я не нашёл обсуждения данного вопроса (про текстовую капчу). Давайте всё-такие обсудим этот вопрос. Меня интересует реализация 2+3=5 не под вордпресс. Заранее благодарен.
3 Май 2009, 2:24Олег:
Спасибо, уже нашёл здесь.
3 Май 2009, 4:27http://sb-money.ru/article.php?a=80
Евгений:
Здравствуйте. Подскажите пожалуйста как объединить код ваших примеров отправки сообщений и защитное изображение. Если можете приведите пример. Заранее большое спасибо.
23 Июнь 2009, 17:45admin:
Евгений, давайте обсудим это на форуме.
24 Июнь 2009, 10:52Николай:
Интересно Ваше мнение! Что лутше и эфективнее? Разработаный Вами способ наведенный выше или решение http://captcha.ru/.Если все ж таки http://captcha.ru/, есть ли у Вас решение чтоб присоеденить ее к Вашим формам отправки сообщений?
15 Сентябрь 2009, 11:40Николай:
Как не пытался прицепить каптчу вашу и с http://captcha.ru/ к вашей форме отправки сообщений результат никакой, целый день провозился в эксперементах. впустую(. Подскажите плиз может где есть стаейка или как решить вопрос а то в тупике полнейшем. всемогуший гугл тоже не помог(.
15 Сентябрь 2009, 22:55Николай:
Все спасибо! можете удалить посты выше. Решил вопрос! прицепил каптчу.ру работает супер.
16 Сентябрь 2009, 14:30