osh88 / captcha
A PHP captcha implementation
dev-master
2018-03-28 12:30 UTC
Requires
- php: >=5.4
- ext-gd: *
This package is not auto-updated.
Last update: 2024-04-28 03:19:43 UTC
README
This is a PHP >= 5.4 captcha implementation.
- Код капчи лежит в одном месте.
- Для капч не создаются никакие файлы на диске.
- Не требуются сторонние программы, кроме php-gd.
- Простая проверка валидности капчи.
- Простое прикручивание капчи к интерфейсу.
Принцип работы
- С клиента идет AJAX-запрос новой капчи.
- На сервере генерируется текст новой капчи. Текст добавляется в реестр (реестр представляет собой массив в сессии). На основе текста создается изображение. Текст шифруется. На форму отправляется шифрованый текст капчи и изображение в embedded-формате.
- Клиент добавляет полученую картинку на форму. В форме у тега audio задается адрес аудиокапчи.
- Если пользователь запускает воспроизведение аудиокапчи, на сервер идет запрос на получение аудиофайла, в качестве параметра передается шифрованая капча. На сервере капча расшифровывается, на основе ее текста склеиваются короткие аудиофайлы, содержащие озвучку букв и цифр. Полученый файл отправляется клиенту. Далее происходит воспроизведение.
- При нажатии ЛКМ на картинке, повторяются пункты 1-3.
- Далее пользователь заполняет форму, вводит капчу. При отправке формы на сервер вместе с данными отправляются шифрованая капча и введенная пользователем.
- На сервере капча расшифровывается, затем проверяется есть ли она в реестре. Если есть, то она сравнивается с введенной пользователем. Если все проверки пройдены успешно, то капча удаляется из реестра. Теперь эту капчу можно будет использовать только после новой выдачи сервером.
Пример использования (laravel)
app/Providers/AppServiceProvider.php:
use Captcha\Captcha; // Регистрирует класс в контейнере public function register() { $this->app->singleton('Captcha\\Captcha', function($app) { return new Captcha('1234567890123456'); }); }
routes/web.php:
<?php Route::get('/', function () { return view('main'); }); // Отдает данные новой капчи Route::get('/captcha', function () { $lang = request()->input('lang', 'en'); $length = request()->input('length', 5); return json_encode(app('Captcha\\Captcha')->make($lang, $length)); }); // Отдает файл аудиокапчи Route::get('/captcha/audio', function () { $c = request()->input('c', null); app('Captcha\\Captcha')->sendAudio($c); }); // Отдает скрипт для работы с капчей Route::get('/captcha.js', function () { return app('Captcha\\Captcha')->getCaptchaJS(); }); // Проверка работы капчи Route::post('/submit', function () { $answer = request()->input('captcha', null); // answer $data = request()->input('cdata', null); // crypted captcha return app('Captcha\\Captcha')->verify($data, $answer) ? 'Valid':'Bad'; });
resources/views/main.blade.php:
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="csrf-token" content="{{ csrf_token() }}"> <script src="http://code.jquery.com/jquery-1.12.4.min.js"></script> {{-- Подключаем скрипт --}} <script src="/captcha.js"></script> </head> <body> {{-- Для работы капчи в форме достаточно двух объектов: --}} <form id="checkCaptcha"> {{-- Тэг img с классом captcha-image - сюда будет выводиться картинка --}} <img class="captcha-image"/> {{-- Любой тэг с классом captcha-play - при нажатии на него, будет воспроизводиться аудиокапча --}} <i class="captcha-play" style="font-size: xx-large;">♬</i><br/> {{-- Остальные поля могут быть какими угодно --}} <input name="captcha" type="text"/> <input type="button" value="check" class="check"> <div class="result"></div> </form> <script> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $(document).ready(function(){ var $form = $('#checkCaptcha'); // Создаем новую капчу $form.captcha('en', '4', 'cdata'); // $form.captcha(); // default params // $form.captcha('en', 5, 'captcha_data'); // default params // Отправляем форму на проверку $form.find('.check').click(function(){ $.post('/submit', $form.serialize(), function(result) { $form.find('.result').html(result); }); }); }); </script> </body> </html>
Installation
The preferred installation method is composer:
composer require "osh88/captcha:*@dev"
Git
git clone https://github.com/osh88/captcha.git
require '/vendor/captcha/src/Captcha/Captcha.php';
require '/vendor/captcha/src/Captcha/Encrypter.php';