Уголок веб-разработчика

сайт для веб-мастеров и веб-разработчиков


Реклама на сайте
как разместить свою рекламу?



Блог о веб-разработке!



Скрипт текстовой CAPTCHA для защиты от спам-ботов
(от 30.07.2012)

Автор: Михаил Пестречихин
Источник: http://www.codething.ru/captcha.php

Практически каждый пользователь интернета регулярно сталкивается с CAPTCHA (в русском языке за этой аббревиатурой закрепилось существительное "капча"). В классическом случае CAPTCHA - это картинка, содержащая искаженные буквы и цифры, которые надо ввести в текстовое поле рядом для подтверждения того, что вы являетесь человеком, а не роботом, рассылающим спам. Существуют и более экзотические формы капчи, например, выполненные в форме теста, загадки или мини-игры. И все это ради защиты от автоматического заполнения форм роботами, рассылающими спам.

Классический внешний вид CAPTCHA показан на рисунке:

Классический внешний вид CAPTCHA
1. Защита от спама в соц.сети "ВКонтакте" . 2. reCAPTCHA.

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) - это полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей. Подробнее можно прочитать в Википедии.

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

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

Принцип работы нашей CAPTCHA будет таким. Капча будет формировать в текущей сессии две переменные:
1. Вопрос в виде арифметического выражения a+b, где 2<=(a+b)<=10;
2. Ответ в виде хэша md5 от результата суммы N+M, записанного прописью, например, md5("четыре").

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

При проверке капчи из ответа пользователя надо будет также получать хэш md5.

Программный код скрипта текстовой CAPTCHA

Файл mycaptcha.php, содержащий программный код для генерации вопроса и ответа CAPTCHA.

<?php

	function GenerateCAPTCHA()
	{
		$nums = array("1"=>"один", "2"=>"два", "3"=>"три", "4"=>"четыре",
					  "5"=>"пять", "6"=>"шесть", "7"=>"семь", "8"=>"восемь", "9"=>"девять", 

"10"=>"десять");
		
		//	формируем пример a+b
		$rez = rand(2,10);			
		$a = rand(1,$rez-1);
		$b = $rez-$a;	
		
		// записываем в сессию вопрос a+b
		$_SESSION['mycaptcha_text']=$a." + ".$b;
		
		// записываем в сессию хэш ответа прописью
		$_SESSION['mycaptcha_string']=md5($nums[$rez]);
	}
	
?>

Файл index.php, содержащий пример обращения и использования нашей CAPTCHA в пользовательской форме

<?php
	session_start(); 			// запускаем сессию, она важна
	include ("mycaptcha.php"); 	// вызываем модуль генерации CAPTCHA
	
	if (!isset($_REQUEST['string'])) // если пользователь не ввел ответ, 
	{								 // формируем и выдаем ему вопрос
		generateCAPTCHA();
		echo "

Вопрос: ".$_SESSION['mycaptcha_text']."?

"; } else // иначе проверяем правильность ответа пользователя и выдаем результат { if (md5(mb_strtolower(trim($_REQUEST['string']),"utf-8")) == $_SESSION['mycaptcha_string']) echo "

Верно!

"; else echo "

Неверно!

"; } ?> <form method="POST"> Введите ответ прописью, например, "четыре":<br/> <input name="string"/> </form>

В условии

if (md5(mb_strtolower(trim($_REQUEST['string']),"utf-8")) == $_SESSION['mycaptcha_string'])
Перед тем, как получить хэш md5 - убираем излишние пробелы по краям пользовательского ответа (функция trim()) и приводим ответ к нижнему регистру (функция mb_strtolower()).

Сложность данного примера можно повысить, изменив строку в файле mycaptcha.php:

$_SESSION['mycaptcha_text']=$a." + ".$b;
на
$_SESSION['mycaptcha_text']=$nums[$a]." + ".$nums[$b];

В таком случае, вопрос a+b будет выводиться также прописью, что затруднит его считывание роботом.

Для того, чтобы пример работал корректно, необходимо:
1. Все файлы должны быть записаны в кодировке UTF-8.
2. Скрипты должны выполняться на веб-сервере, а не запускаться в браузере, как файл.

Скачать исходные файлы примера (2 кб):
http://codething.ru/files/captcha.zip

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

Хотите дополнить - пишите: studio@pestr.ru

Статьи по теме

Делаем форму обратной связи на сайт с защитой от спама;
Скрипт для голосования своими руками на PHP и MySQL с использованием AJAX;
Гостевая книга своими руками на PHP и MySQL.
Гостевая книга своими руками на PHP и MySQL. Добавляем динамизма. AJAX + jQuery.







Rambler's Top100
© Студия Михаила Пестречихина, 2008-2017
При перепечатке и копировании статей с сайта указание автора и URL статьи обязательно!
Программный код, приведенный в статьях в качестве примеров, можно использовать без каких-либо ограничений.
Работоспособность, надежность и безопасность программного кода из примеров не гарантируется.
Хостинг «Джино»