Арифметическая капча для сайта на php

Арифметическая капча для сайта на phpКак-то давно я уже писал про создание формы с капчей. Прошло некотороя время и я решил немного модернизировать капчу — сделать вывод не чисел, а арифметического примера. Что получилось можете посмотреть ниже, в коде.
Весь исходник состоит их двух файлов, index.php – форма для ввода капчи и код проверяющий корректность введенной капчи, capcha.php – скрипт генерирующий капчу.

Начнем с формы — файл index.php, вот ее код:

<?php  
// старт сессии
session_start(); 
// если были отправлены данные
if(!empty($_POST)){
	// Сравниваем введенную капчу с тем, что храниться в сессии
	if($_SESSION['capcha'] == $_POST['capcha']){
		echo 'Капча верная';
	}else {
		echo 'Капча не верная';
	} 
	// Удаляем значение капчи из сессии 
	unset($_SESSION['capcha']);  
}
?>
<br/>
<br/>
<form method="post" action="index.php">
    <img src="capcha.php" width="120" height="40" /><br />
    Код с картинки: <input type="text" name="capcha" /><br />
    <input type="submit" value="Отправить" />
</form>

И код генерации капчи, код подробно прокомментирован, поэтому в нем легко разобраться:

//========= Задаем параметры капчи(при желании можно вынести в отдельный файл - config)
// шрифт символов на капче( шрифт лучше положить в папку со скриптом)
$font = 'Arial_Regular.ttf'; 
// Размер шрифта 
$fontsize = 20; 
// Размер капчи
$width = 120; // - длина
$height = 40; // - высота
// количество полосок на капче
$countLine = 3;
//==========
 
// Задаем заголовок для вывода картинки
header('Content-type: image/png');  
// Создаем изображение
$img = imagecreatetruecolor($width, $height);  
// фон для капчи
$white = imagecolorallocate($img, 220, 220, 220); 
imagefill($img, 0, 0, $white); 
// Переменная, для хранения значения капчи
$capchaText = ''; 

// придумываем пример для капчи
$a = mt_rand(1, 19);
$b = mt_rand(1, 19);
$capchaText = $a . '+' . $b . '=';
// Ответ на пример, запишем в сессию для проверки
$capchaResult = $a + $b;

// ========= Заполням изображение символами
for ($i = 0; $i < strlen($capchaText); $i++){ 
    // Из списка символов, берем случайный символ 
    $litteral = $capchaText[$i];  
    // Вычесляем положение одного символа
    $x = ($width - 20) / strlen($capchaText) * $i + 10; 
    $y = $height - (($height - $fontsize) / 2);     
    // Сгенерируем случайный цвет для символа. 
    $color = imagecolorallocate($img, rand(0, 150), rand(0, 150), rand(0, 150) );  
    // Генерируем угол наклона символа 
    $naklon = rand(-10, 10); 
    // Рисуем один символ
    imagettftext($img, $fontsize, $naklon, $x, $y, $color, $font, $litteral); 
}
// ==========

// ========== Добавим на капчу несколько рандомных полосок
for ($i = 0; $i < $countLine; $i++){ 
	// сгенерируем координаты для линии
	$part = $width/100; // длина картинки в процентах
	$x1 = mt_rand(0, round($part*30)); // x1 не больше чем до 30% картики
	$y1 = mt_rand(0, $height);
	$x2 = mt_rand(round($part*70), round($part*100)); // x2 не меньше чем от 70% картики
	$y2 = mt_rand(0, $height);
	// сгенерируем случайный цвет для линии
    $color = imagecolorallocate($img, rand(0, 150), rand(0, 150), rand(0, 150) );  
	imageline ($img, $x1, $y1, $x2, $y2, $color );
}
// ==========
 
// Запускаем сессию, и записывем в нее значение капчи. Это понадобится для проверки с тем, что вводит юзер
session_start(); 
$_SESSION['capcha'] = $capchaResult; 
// вывод капчи на страницу
imagepng($img);  
// чистим память, корторую мы заняли при создании картинки
imagedestroy($img);

Вот и все, арифметическая капча готова.

Рассказать друзьям:


Оценить:
(4 оценок, среднее: 4,25 из 5)

Арифметическая капча для сайта на php: 13 комментариев

  1. Разместил файл с капчей index.php по адресу http://philatelist.by/index.php и дополнительно здесь же файл capcha.php При этом никакой картинки с примером я не вижу. Подскажите, пожалуйста, что я сделал неправильно?

  2. Олег, просто нужно разместить шрифт в папке с файлами примера.
    Можешь задать обычный ариал $font = ‘Arial.ttf’;
    Или какой другой…

  3. добавьте файл шрифтов и пропишите правильно путь к нему в и будет работать

  4. Странное дело, в Денвере всё работает хорошо, а выкладываю на хостинг — не отображаются символы. То есть окошко есть и полоски на него накладываются, а чисел и знаков + и = нет. Из-за чего может быть? Может, какой модуль PHP не подключен или библиотеки какой нет?

  5. У меня если её не отгадать а сразу нажать кнопку войти то капча пропускает.
    Будто для виду стоит.
    Вот код админки:

    <?
    if(! defined('BASEPATH') ){ exit('Unable to view file.'); }
    $mesaj = 'Connect to Admin Panel’;

    if(isset($_POST[‘logare’])) {
    $name = $db->EscapeString($_POST[‘login’]);
    $pass = $db->EscapeString($_POST[‘pass’]);

    $sql = $db->Query(«SELECT id FROM `admins` WHERE `login`='».$name.»‘ AND `pass`=MD5(‘».$pass.»‘)»);
    $num = $db->GetNumRows($sql);
    if($num > 0) {
    $db->Query(«UPDATE `admins` SET `online`=NOW() WHERE `login`='».$name.»‘»);
    $_SESSION[‘EX_admin’] = $name;
    redirect(‘index.php’);
    }else{
    $mesaj = ‘Wrong Username or Password’;
    }
    }
    ?>

    Admin Login

    Digits in image:
    Login

    Forgot password?

    1. Добрый день.
      Проверьте — в сессию записывается код капчи при ее генерации? И посмотрите, что приходит в post-запросе

        1. в php написать в начале скрипта, где проверка капчи:
          var_dump($_SESSION[‘capcha’] );
          var_dump($_POST[‘capcha’]);

          1. Вписал в PHP-админки над:
            // старт сессии
            session_start();
            // если были отправлены данные
            if(!empty($_POST)){
            // Сравниваем введенную капчу с тем, что храниться в сессии
            if($_SESSION[‘capcha’] == $_POST[‘capcha’]){
            echo ‘Капча верная’;
            }else {
            echo ‘Капча не верная’;
            }
            // Удаляем значение капчи из сессии
            unset($_SESSION[‘capcha’]);

            А дальше что?

          2. Ну а var_dump что вывел? есть данные в сессии и посте?
            и сессию надо самой первой запускать

  6. Если-б я знал про что Вы. Какие-то сессии..
    Единственное что изменилось так это на страничке появились слева наверху 2 слова:
    NULL NULL
    Капча по прежнему- Стоит для вида(пропускает).

    1. >Капча по прежнему- Стоит для вида(пропускает).
      Потому что var_dump не чинит, а дебажит код :)

      У вас в сессию и пост ни чего не пишется — null выводится. Ищите проблему при записи в сессию и отправке пост-запроса.
      Проверьте, чтобы в скрипте генерации капчи был старт сесии. И во всех скриптах, где происходит старт сессии функция session_start(); была вызвана до объявления заголовков.
      Также условие свое проверьте — что бы при отличии кода капч и кода в посте, отображалась соответствующая верстка страницы

Добавить комментарий для EVg Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code