Блог веб разработки статьи | видеообзоры | исходный код

Блог веб разработки статьи | видеообзоры | исходный код

webfanat вконтакте webfanat youtube

капча php

капча  php

Всем привет, сегодня мы рассмотрим как сделать капчу или по другому проверочный код своими руками.

Прежде всего следует понимать что капча которую мы будем делать представляет собой картинку (png, jpg или gif) на которой изображен шифр(код ) который необходимо ввести пользователю.

Рассмотрим подробнее на форме авторизации, cоздадим три файла:

index.php - Файл с формой авторизации

login.php - Файл с обработчиком

сaptcha.php - файл генерирующий капчу

В файле index.php

<?php 
session_start();
function message(){ //Функция вывода сообщений о результате запроса
    if(isset($_SESSION['success'])){
        echo '<p style="color:green;">'.$_SESSION['success'].'</p>';
        unset($_SESSION['success']);
    }
    if(isset($_SESSION['error'])){
        echo '<p style="color:red;">'.$_SESSION['error'].'</p>';
        unset($_SESSION['error']);
    }
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>
            Капча
        </title>
    </head>
    <body>
    <div  style="text-align:center;">
        <?php  message(); //Вызов функции вывода сообщений?>
    </div>

    <form action="login.php" method="post">
        <input type="text"  name="login" required placeholder="Введите логин"/>
        <br/>
        <br/>
        <input type="password" name="password" required placeholder="Введите пароль"/>
        <br/>
        <br/>
        <img src="captcha.php" alt="капча">
        <br/>
        <br/>
        <input type="text" name="captcha" placeholder="Ввести проверочный код"/>
        <br/>
        <br/>
        <input type="submit" name="send" value="Авторизоваться"/>
    </form>
    </body>
</html>

Как видите здесь ничего сложного нет, в качестве пути к картинке мы используем путь к файлу captcha.php

В файле обработчике login.php

session_start();
/*Проверка соответствия проверочного кода */
if(isset($_POST['captcha']) && trim($_POST['captcha']) !== '' && $_SESSION['captcha'] === $_POST['captcha']){
    /*Какой то код*/
   $_SESSION['success'] = 'Форма успешно отправлена';
}
else{
    $_SESSION['error'] = 'Неверно введен проверочный код';
}
header('Location: index.php');
exit();

В файле обработчике как видите мы тщательно проверяем совпадает ли код который передал нам пользователь с содержимым Сесси captcha , которую мы будем генерировать в файле captcha.php.

И так, давайте теперь разберемся с содержимым файла captcha.php, здесь нам необходимо сгенерировать изображение с помощью php:

Первое что мы делаем:

session_start();//Стартуем сессию
header("Content-type: image/png");//Отправляем заголовок (файл типа png-изображение)

Создаем дескриптор изображения, задаем размеры и делаем фон:

$img = imagecreatetruecolor(130, 24) or die('Cannot create image');
imagefill($img, 0, 0, 0xFFFFFF);

$img - дескритор изображения,; 130,24 - ширина и высота; 0,0 - координаты начала заливки; 0xFFFFFF - белый цвет данная запись эквивалентна (#fffff)

Едем дальше и создадим четыре переменных:

$x = 0;//Координата x символа

$i = 1;//Координата y символа

$code = '';//Код

$str = "abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789";//варианты символы которые будут присутствовать в нашем коде

Далее нам необходимо сгенерировать наш проверочный код

пишем цикл for:

for($i=0;$i < 5;$i++){
    imagettftext($img, rand(14, 18), rand(-12, 12), $x = $x + 20, 15 + rand(0, 5),
        imagecoloralLocate($img, rand(0, $i * 25),  rand(0, $i * 25),  rand(0, $i * 25)),"verdana.ttf",$rnd =  $str[rand(0,mb_strlen($str))]);
    $code = $code.$rnd;
    imageline($img,0,rand(0,24),130,rand(0,40),$DDDDDD);
}

смотрим что у нас тут получилось.

imagettftext - эта функция отвечает за генерацию текста с расширением ttf на изображении.

imagettftext (Дескриптор изображения, Размер текста, Угол наклона текста, Координата текста по X, Координата текста по Y, Цвет текста, Шрифт текста, текст);

Цвет текста генерируется с помощью функции imagecoloralLocate которой передается дескриптор изображения и три числовых параметра rgb.

Следует еще заметить что нам нужен шрифт с расширением ttf, в нашем случае это verdana.ttf поэтому вы должны закинуть этот шрифт рядом с файлом captcha.php или прописать до него путь.

Как видите на каждой итерации цикла у нас генерируется случайный символ из строки srt и с помощью функции rand() генерируются случайные величины параметров в определенных интервалах.

Все символы записываются:

$code = $code.$rnd;

imageline - Функция которая рисует линию в качестве аргументов принимаются дескриптор изображения, начальная и конечная координаты x, y; цвет линий.

Линии я использовал в качестве так называемого шумового эффекта.

И на последок , мы после цикла записываем полученный код в Сессию для дальнейшего сравнения с кодом который отправит нам пользователь

$_SESSION['captcha'] = $code;//Запись в сессию
imagepng($img);//Формируем png изображение
imagedestroy($img);// Уничтожаем дескриптор изображения

Полный код файла captcha.php будет выглдеть так:

session_start();
header("Content-type: image/png");
$img = imagecreatetruecolor(130, 24) or die('Cannot create image');
imagefill($img, 0, 0, 0xFFFFFF);
$x = 0;
$i = 1;
$code = '';
$str = "abcdefghijklnmopqrstuvwxyz0123456789";
    for($i=0;$i < 5;$i++){
            imagettftext($img, rand(14, 18), rand(-12, 12), $x = $x + 20, 15 + rand(0, 5),
            imagecoloralLocate($img, rand(0, $i * 25),  rand(0, $i * 25),  rand(0, $i * 25)),
            "verdana.ttf",$rnd =  $str[rand(0,mb_strlen($str))]);
        $code = $code.$rnd;
        imageline($img,0,rand(0,24),130,rand(0,40),0x000000);
    }
$_SESSION['captcha'] = $code;
imagepng($img);
imagedestroy($img);
exit();

Теперь проверяем как все работает. Заходим в файл index.php, где находиться наша форма авторизации . Там должна генерироваться наша картинка с проверочным кодом. Вводим произвольные данные и проверочный код с картинки. В результате если код введен верно должно отобразиться сообщение что форма отправлена.

Проверочный код предназначен прежде всего для безопасности: защиты от спама и флуда и т.п. Поэтому лучше такой мерой защиты не пренебрегать!

На этом дорогие друзья данная статья подошла к концу, скажу на последок что google предлагает возможность использования своей капчи 'Я не робот' или recaptcha .

А на этом все. Я надеюсь данная статья была для вас содержательна и полезна. Удачи!

Оцените статью:

Статьи

Комментарии

Внимание!!! Комментарий теперь перед публикацией проходит модерацию

zik123123

12:00 26-09-2020

Прикольно, теперь для моей соц сети есть Капча.

Реклама

Запись экрана

Данное расширение позволяет записывать экран и выводит видео в формате webm