Как-то давно я уже писал про создание формы с капчей. Прошло некотороя время и я решил немного модернизировать капчу — сделать вывод не чисел, а арифметического примера. Что получилось можете посмотреть ниже, в коде.
Весь исходник состоит их двух файлов, 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);
Вот и все, арифметическая капча готова.
Разместил файл с капчей index.php по адресу http://philatelist.by/index.php и дополнительно здесь же файл capcha.php При этом никакой картинки с примером я не вижу. Подскажите, пожалуйста, что я сделал неправильно?
Олег, просто нужно разместить шрифт в папке с файлами примера.
Можешь задать обычный ариал $font = ‘Arial.ttf’;
Или какой другой…
добавьте файл шрифтов и пропишите правильно путь к нему в и будет работать
Странное дело, в Денвере всё работает хорошо, а выкладываю на хостинг — не отображаются символы. То есть окошко есть и полоски на него накладываются, а чисел и знаков + и = нет. Из-за чего может быть? Может, какой модуль PHP не подключен или библиотеки какой нет?
У меня если её не отгадать а сразу нажать кнопку войти то капча пропускает.
Будто для виду стоит.
Вот код админки:
<?
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?
https://gist.github.com/ARMADAIX/580a1ac192ea17e141d64b868c8ec2c6
Добрый день.
Проверьте — в сессию записывается код капчи при ее генерации? И посмотрите, что приходит в post-запросе
Я плохо знаю PHP. Как это всё сделать что Вы пишете?
в php написать в начале скрипта, где проверка капчи:
var_dump($_SESSION[‘capcha’] );
var_dump($_POST[‘capcha’]);
Вписал в PHP-админки над:
// старт сессии
session_start();
// если были отправлены данные
if(!empty($_POST)){
// Сравниваем введенную капчу с тем, что храниться в сессии
if($_SESSION[‘capcha’] == $_POST[‘capcha’]){
echo ‘Капча верная’;
}else {
echo ‘Капча не верная’;
}
// Удаляем значение капчи из сессии
unset($_SESSION[‘capcha’]);
А дальше что?
Ну а var_dump что вывел? есть данные в сессии и посте?
и сессию надо самой первой запускать
Если-б я знал про что Вы. Какие-то сессии..
Единственное что изменилось так это на страничке появились слева наверху 2 слова:
NULL NULL
Капча по прежнему- Стоит для вида(пропускает).
>Капча по прежнему- Стоит для вида(пропускает).
Потому что var_dump не чинит, а дебажит код :)
У вас в сессию и пост ни чего не пишется — null выводится. Ищите проблему при записи в сессию и отправке пост-запроса.
Проверьте, чтобы в скрипте генерации капчи был старт сесии. И во всех скриптах, где происходит старт сессии функция session_start(); была вызвана до объявления заголовков.
Также условие свое проверьте — что бы при отличии кода капч и кода в посте, отображалась соответствующая верстка страницы