captcha на php
- 4 July, 2008
- Posted in PHP
Tags : PHP- 4 Comments
Создаем “каптчу” или боремся со спам-ботами)
Перед нами стоит задача – написать простой скрипт, генерирующий картинку с циферками, а также нам необходимо будет проверить, соответствуют ли введенные пользователем данные изображенным на”captcha”.
Первым делом пишем скрипт:
if (empty($_SESSION)) {
session_start();
}
# generate 5 digit random number
$rand = rand(10000, 99999);
$_SESSION['captcha'] = md5($rand);
if ($rand) {
header("Expires: Sun, 1 Jan 2000 12:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Content-type: image/jpeg');
$image = imagecreate(55, 15);
$bgColor = imagecolorallocate($image, 255, 255, 255);
$textColor = imagecolorallocate($image, 0, 0, 0);
imagestring($image, 5, 5, 0, $rand, $textColor);
imagejpeg($image);
imagedestroy($image);
}
называем его, например – security_img.php, сохраняем.
Далее в коде формы пишем:
<img src="security_img.php" alt="Security code"> <input id="security_code" name="security_code" type="text" value="" />
А проверять введенные данные на соответствие будем следующим образом:
if($_SESSION['captcha'] == md5($_POST['security_code']) ) {
echo "Вы человек!";
} else {
echo "ТЫ РОБОТ-СПАМЕР =)!";
}
Хз, у меня кстати несмотря на хедиры “не кешировать” все равно бывают случаи, когда картинка кешируется, потому чтобы наверняка, я туда еще хвост добавляю => src=”security_img.php”
теги вырезались
вообщем я хотел написать src=”security_img.php?435fefewfwef”.
Я обычно в конец ссылки на генерирующееся изображения, добавляю rand или дату текущую, а вообще на сайте captcha.ru там пример как не нужно писать капчи
Лично мы взяли их решение за основу.
Хорошо бы пример обновить для создания капчей, которые бы пользовались популярностью на данный момент: с искривленным текстом и прочими эффектами, чтобы защита не была формальной. Это не упрек, это пожелание, так как считаю, что топик пост был бы более актуальным