Скрипт капчи своими руками который работает на PHP-7, готовое решение капчи дл сайта
Автор: © web-rubik
3487 Просмотры
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