Новые статьи
Категории
- Новости (1)
- Дизайн (1)
- Программирование (3)
- Продукты (2)
- Записки гения (3)
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;
