Капча на PHP
Live laboratory »
PHP » Капча на PHP
Любой владелец сайта сталкивается с проблемой флуда. Как защитить свой сайт от ботов?
Демо ИсходникCAPTCHA (Completely Automatic Public Turing Test to Tell Computers and Humans Apart) -полностью автоматический тест Тьюринга для различения компьютеров и людей.
Чаще всего капча используется для защиты от ботов.
Расмотрим пример простой капчи:
<?
// Выставляем уровень обработки ошибок
error_reporting(E_ALL & ~E_NOTICE);
// Ширина изображения
$width = 150;
// Высота изображения
$height = 50;
// Количество символов в коде
$sign = 5;
// Защитный код
$code = "";
// Инициируем сессию
session_start();
// Символы, используемые в коде
$letters = array('a','b','c','d','e','f',
'g','h','j','k','m','n',
'p','q','r','s','t','u',
'v','w','x','y','z','2',
'3','4','5','6','7','8','9');
// Компоненты для RGB-цвета
$figures = array('50','70','90','110',
'130','150','170','190','210');
// Создаем пустое изображение
$img = imagecreatetruecolor($width, $height);
// Заливаем фон белым цветом
$fon = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 0, 0, $fon);
// Накладываем защитный код
for($i=0; $i<$sign; $i++)
{
//Ориентир
$h = 1;
//Рисуем
$color = imagecolorallocatealpha(
$img,
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
rand(10,30));
// Генерируем случайный символ
$letter = $letters[rand(0,sizeof($letters)-1)];
// Формируем координаты для вывода символа
if(empty($x)) $x = $width*0.08;
else $x = $x + ($width*0.8)/$sign+rand(0,$width*0.01);
if($h == rand(1,2)) $y = (($height*1)/4) + rand(0,$height*0.1);
else $y = (($height*1)/4) - rand(0,$height*0.1);
// Запоминаем символ в переменной $code
$code .= $letter;
// Изменяем регистр символа
if($h == rand(0,1)) $letter = strtoupper($letter);
// Выводим символ на изображение
imagestring($img, 6 ,$x, $y, $letter, $color);
}
// Помещаем защитный код в сессию
$_SESSION['code'] = $code;
// Выводим изображение
header ("Content-type: image/jpeg");
imagejpeg($img);
?>
Этот скрипт непосредственно формирует случайную последовательность символов и чисел на изображении. Для его работы нужна библиотека GDLib.
Переменная $code помещается в сессию, для того чтобы обработчик формы имел возможность сравнить введенный пользователем и сгенерированный коды. Так как данные из сессии не покидают сервер, злоумышленник не имеет возможности украсть защищенный код, сталкиваясь со сложной задачей распознавания образов, затраты на решение которой не всегда оправданны.
Можно добавить наложение шума. Дописываем следующее перед наложением защитного кода.
for($j=0; $j<$width; $j++)
{
for($i=0; $i<($height*$width)/1000; $i++)
{
$color = imagecolorallocatealpha(
$img,
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
$figures[rand(0,count($figures)-1)],
rand(10,30));
imagesetpixel($img,
rand(0,$width),
rand(0,$height),
$color);
}
}
Но я не советую использовать шум - людям будет сложнее прочитать защитный код, в тоже время для ботов это не составит труда.
Вот пример формы, защищенной написанной капчей. Скрипт, который представлен выше, назовем captcha.php
<?php
error_reporting(E_ALL & ~E_NOTICE);
session_start();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Пример</title>
</head>
<body>
<?php
if(isset($_POST['code']) && isset($_SESSION['code']))
{
if(strtolower($_POST['code']) == $_SESSION['code'])
echo '<font color="green">Защитный код верен!</font>';
else
echo '<font color="red">Неверный защитный код!</font>';
}
else
{
?>
<form method="post">
<img src="captcha.php" border="0" alt="Введите защитный код"><br>
<input type="text" name="code"><br>
<input type="submit" value="Ввести">
</form>
<?php
}
?>
</body>
</html>
Хочется добавить что в интернете существует огромное кол-во примеров капч и сервисов, предоставляющие свои услуги. Можете выбрать любой понравившийся скрипт и пусть ваши сайты будут защищеными :)
Комментарии посетителей