Скрипт текстовой CAPTCHA для защиты от спам-ботов (от 30.07.2012)
	
Автор:  
Источник: /captcha.php 
	
Практически каждый пользователь интернета регулярно сталкивается с 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. 
Забиваем Сайты В ТОП КУВАЛДОЙ - Уникальные возможности от SeoHammer 
Каждая ссылка анализируется по трем пакетам оценки:  SEO, Трафик и SMM. 
SeoHammer делает продвижение сайта прозрачным и простым занятием. 
Ссылки, вечные ссылки, статьи, упоминания, пресс-релизы - используйте по максимуму потенциал SeoHammer для продвижения вашего сайта. 
 
Что умеет делать SeoHammer 
— Продвижение в один клик, интеллектуальный подбор запросов, покупка самых лучших ссылок с высокой степенью качества у лучших бирж ссылок.  
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.  
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).  
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание. 
 
SeoHammer еще предоставляет технологию  Буст, она ускоряет продвижение в десятки раз, 
а первые результаты появляются уже в течение первых 7 дней.
 
Зарегистрироваться и Начать продвижение
 
Программный код скрипта текстовой 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 кб): 
/files/captcha.zip
 
Механизм CAPTCHA можно применять для защиты гостевых книг, комментариев, форм обратной связи от спама, а также для защиты форм регистрации от прохождения автоматических регистраций спам-ботами. 
Хотите дополнить - пишите: 
 
	
Статьи по теме
	Делаем форму обратной связи на сайт с защитой от спама; 
	Скрипт для голосования своими руками на PHP и MySQL с использованием AJAX; 
	Гостевая книга своими руками на PHP и MySQL. 
	Гостевая книга своими руками на PHP и MySQL. Добавляем динамизма. AJAX + jQuery. 
 											
										
 
										
  
  										
									 |