Скрипт капчи своими руками который работает на PHP-7, готовое решение капчи дл сайта
Автор: © web-rubik
2244 Просмотры
7 Понравилось
Создание капчи для сайта самостоятельно работающей на PHP 7-ой серии.
Давно ничего не писал, но с переводом сайта на PHP-7 много чего перестало работать, капча в том числе, о чем и будет посвящена данная статья. У меня был встроен готовый скрипт капчи, который был написан не мною, и он отказывался работать как бы я его только не крутил. В итоге, я решил построить скрипт капчи своими руками, который работал бы на PHP 7-ой серии.
Алгоритм должен быть довольно простым, но в то же время сложен для программ взлома. На мой взгляд, лучший вариант, это изображение. Нам понадобится создать изображение, да ещё и запомнить значение, которое будет отображаться в нём. Для этого мы воспользуемся языком PHP и создадим файл, который будет нам всё это делать, назовём его capcha.php
<?php // Файл capcha.php //Переменная, в которой храниться список символов. используемых в капче $let = '0123456789'; // количество символов в капче $len = 4; // шрифт символов на капче( путь должен быть обязательно обсалютным! ) $font = $_SERVER['DOCUMENT_ROOT'].'/impact.ttf'; // Размер шрифта $fontsize = 20; // Размер капчи ( картинки ) $width = 100; // - длина $height = 30; // - высота // Задаем заголовок для вывода картинки header('Content-type: image/png'); // Создаем изображение $img = imagecreatetruecolor($width, $height); // фон для капчи $white = imagecolorallocate($img, 220, 220, 220); imagefill($img, 0, 0, $white); // Переменная, для хранения значения капчи $capchaText = ''; // Заполням изображение линиями $line_color = imagecolorallocate($img, 64,64,64); for ($i=0;$i<10;$i++) { imageline($img,0,rand()%50,200,rand()%50,$line_color); } // Заполням изображение точками $pixel_color = imagecolorallocate($img, 0,0,255); for ($i=0;$i<1000;$i++) { imagesetpixel($img,rand()%200,rand()%50,$pixel_color); } // Заполням изображение символами for ($i = 0; $i < $len; $i++) { // Из списка символов, берем случайный символ $capchaText .= $let[rand(0, strlen($let)-1)]; // Вычесляем положение одного символа $x = ($width - 20) / $len * $i + 10; $y = $height - (($height - $fontsize) / 2); // Укажем случайный цвет для символа. $color = imagecolorallocate($img, rand(0, 150), rand(0, 150), rand(0, 150) ); // Генерируем угол наклона символа $naklon = rand(-30, 30); // Рисуем символ imagettftext($img, $fontsize, $naklon, $x, $y, $color, $font, $capchaText[$i]); } // Запускаем сессию, и записываем в нее значение капчи. Это понадобится для проверки с тем, что вводит юзер session_start(); $_SESSION['capcha'] = $capchaText; // вывод капчи на страницу imagepng($img); // чистим память, корторую мы заняли при создании картинки imagedestroy($img); ?>
Нам осталось вывести изображение в форме, сделать кнопку смены изображения и сравнить значение в скрипте обработчике.
<?php // Скрипт обработчик // старт сессии session_start(); // Сравниваем введенную капчу с тем, что храниться в сессии if($_SESSION['capcha'] == $_POST['capcha']){ echo 'Капча верная'; }else { echo 'Капча не верная'; } // Удаляем значение капчи из сессии unset($_SESSION['capcha']); ?> <!doctype html> <html lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Капча</title> <script src="jquery.js"></script> </head> <body> <!-- Основное содержимое --> <article> <form method="post"> <img id="img" src="capcha.php" width="100" height="30" /> <img id="update" src="update.png" width="16" height="16" style="padding-bottom:5px; padding-left:5px; cursor:pointer;" title="Обновить" onclick="document.getElementById('img').src = 'capcha.php?' + Math.random()"> <br /> <input name="capcha" type="text" placeholder="Код с картинки *" required=""> <input type="submit" value="Отправить" /> </form> </article> <script> $('#img').attr('src', 'capcha.php?r=' + Math.random()); </script> </body> </html>
В исходниках я положил файлы шрифта impact.ttf и библиотеки JQuery jquery.js, она нам понадобится для смены изображения на новое.
Что не понятно пишите в комментариях.
Комментариев нет или
Оставить комментарий
Оставленные комментарии проверяются технической частью интернет портала Web-rubik.ru