captcha php

26-02-2009 05:15
Я тут расскажу простой пример, как можно обезопасить свои сайты от спам-роботов.
Мы будем это делать с помощью PHP.

Основной смысл заключается в том, чтобы при генерации формы на сайт мы туда вставили скрытое поле с заранее уже вложенным правильным ответом. Но для того, чтобы спам-бот не смог его использовать в своих коварных целях мы этот правильный ответ еще и зашифруем. С этим может отлично справится фунция base64_encode и serialize. Первая кодирует необходимую строку алгоритмом base64. Это кодирование создано для того, чтобы бинарные данные не терялись в процессе передачи по протоколам, не поддерживающим 8битную передачу. Например, таковыми являются некоторые старые почтовые транспорты. Вторая функция serialize генерирует пригодное для хранения представление переменной.

В итоге, от числа 12 мы получим вот такие значения:
serialize(12) вернет значение i:12;
base64_encode('i:12;') вернет aToxMjs=

Вот это значение мы и спрячем в скрытое поле в форме.
В соседнем поле мы спросим у пользователя - сколько будет 2 умножить на 6.
И теперь на стороне сервера мы сможем сравнить значения путем той же самой сериализации и кодирования введенного пользователем числа. Значения скрытого поля с закодированным ответом должно совпасть с значением введенным пользователем.

Вот такой себе простой способ без применения сессий обезопасить свой сайтец от спама.
Внизу приведен простой листинг PHP-кода данного примера. Пишите коменты =)
<?
#Если ничего не вводилось, то показать форму
if(!$_REQUEST['captcha'] && !$_REQUEST['hidden_captcha'])
{
	# Генерируем два разных числа от 0 до 9
	$first_int = rand(0, 9);
	$second_int = rand(0, 9);
	
	# Деалаем формочку в переменную результата
	$result.='
	<form action="?" method="POST">
	<input 
		type="hidden" 
		name="hidden_captcha" 
		value="'.base64_encode(serialize($first_int+$second_int)).'">
	Солько будет '.$first_int.' плюс '.$second_int.'
	<input type="text" name="captcha">
	<input type="submit">
	</form>
	';
}
# Если есть два парамметра, то выполнить нижний кусок кода
else 
{
	if($_REQUEST['hidden_captcha'] == base64_encode(serialize($_REQUEST['captcha'])))
	{
		$result.='все ок, система защиты пройдена';
	}
	else 
	{
		$result.='похоже, что у вас плохи дела с арифметикой или вы просто спам-бот';
	}
}
# выводим результат
echo $result;