Ну собственно зачем нужна эта картинка с текстом я думаю рассказывать излишне, различного рода спам сейчас стал очень больной темой для обсуждения на форумах и блогах.
Ну дак а как собственно сделать такое чудо ? Вот этим мы сегодня и займёмся.Причём “капчу” делать будем не простую, а “мусорную”(текст будет захламлён точками чёрного цвета).
Создадим два файла с именами captcha.php и form.php.
Далее попробую комментировать всё в коде, делая лишь небольшие отступления:
Captcha.php
- <?php session_start(); //Стартуем сессию, чтобы сохранить текст с картинки для проверки
- header("Content-type: image/png"); //Сообщаем что выводим картинку
- //Создаем пустое изображение размерами 88 на 31 пиксель
- $im = @imagecreate(88,31)
- or die("Cannot Initialize new GD image stream");
- //Задаём цвет фона в формате RGB
- $background_color = imagecolorallocate($im, 255, 255, 255);
- //Чёрный цвет
- $black=imagecolorallocate($im,0,0,0);
- //Белый цвет
- $white=imagecolorallocate($im,255,255,255);
- //Строка, отвечающая за символы, которые будут присутствовать в тексте на картинке
- $str="234C8J95L247N28G34";
- //Определяем длину строки и точку старта для надписи(верхний левый угол)
- $len=strlen($str);
- $x=10;
- $y=20;
- //Текст с картинки пока пуст
- $img="";
- /*
- Цикл, берёт случайный символ из строки и разукрашивает его случайным цветом из диапазона.
- font.ttf должен лежать в одном каталоге с этим фалом или пропишите относительный путь к нему.
- */
- for ($i=0;$i<5;$i++){
- //наклон символов
- $naklon = mt_rand(-7,7);
- //Смещение вверх-вниз
- $stypen = mt_rand(-7,7);
- $c=substr($str,rand(1,$len),1);
- $img.=$c;
- $color = imagecolorallocate($im, mt_rand(0,50), mt_rand(0,50),mt_rand(100,255));
- imagettftext($im, 11 ,$naklon, $x, ($y+$stypen), $color,'font.ttf', $c);
- $x+=15;
- }
- $p=0;
- //Выводим "мусор": простое чередование черных и белых пикселей и вывод на случайную позицию
- //$p - кол-во точек, я остановился на 300, можете поставить больше или меньше, но больше 500 лучше не ставить, ибо плохо читаться будет
- while($p<300)
- {
- $x=mt_rand(1,87);
- $y=mt_rand(1,30);
- $pixel=imagecolorat($im,$x,$y);
- $point=($pixel==$black)?$white : $black;
- imagesetpixel($im,$x,$y,$point);
- $p++;
- }
- //Выводим картинку
- imagepng($im);
- //Чистим память за собой
- imagedestroy($im);
- //Забиваем текст в переменную сессии
- $_SESSION["hide_img"]=$img;
- ?>
Шрифт, используемый в капче можно качнуть тут
form.php
- <?php session_start(); //обязательно должно быть в начале файла, до вывода чего-либо !
- //Небольшая функция, оберегающая от "хороших" людей
- function nohtml($string){
- $string=htmlspecialchars(stripslashes($string));
- $string = mysql_escape_string($string);
- return trim($string);
- }
- //Обязательные теги типа <html>,<body> опущу, только форма
- //Проверяем были ли посланы данные
- if (empty($_POST['send'])){
- echo '<form method="post">';
- echo 'Имя: <input type="text" name="user" size="30"><br><br>';
- echo 'Введите текст с картинки в поле ниже:<br><img src="captcha.php" width="88" heaght="31" alt="Включите картинки!"><br>';
- echo '<input type="text" name="img">';
- echo '<input type="submit" name="send" value="Проверить">';
- echo '</form>';
- }else{
- //Данные пришли, поехали
- //Проверяем отправилось ли имя
- if (!empty($_POST['user'])){
- //Текст с картинки
- if ($_POST['img']==$_SESSION['hide_img']){
- echo nohtml($_POST['user']).", зрение вас не подвело ;)";
- }
- }else echo "Я вас не знаю!";
- }
- ?>
Ну вот собственно и всё, удачной защиты
15.03.2008 в 14:24
Отлично начал! Молодец!
20.03.2008 в 20:10
А как сделать что-б на готовую картинку цифры накладывались? Просто нужно чтоб в картинке капчи был копирайт.
20.03.2008 в 20:22
Svility
Для этого нужно вместо функции imagecreate использовать функции imagecreatefromjpeg или imagecreatefromgif или imagecreatefrompng в зависимости от формата картинки.
02.04.2008 в 00:54
//Создаем пустое изображение размерами 88 на 31 пиксель
$im = @imagecreate(88,31)
не забывай про баннеро-резалку
Используй не стандартные размеры.
02.04.2008 в 09:17
Progr@mmer\
всё, что здесь пишется - чисто для примера )
Код комментирован и ни что не мешает прост сменить размеры у картинки.
05.04.2008 в 17:04
[...] Проверка на бота с использование капчи [...]
22.06.2008 в 22:03
interesnaya statia..Avtor molodec
22.06.2008 в 22:07
DenisKMS, угу, только все cсылки в noindex ^__^