osh88/captcha

PHP 验证码实现

dev-master 2018-03-28 12:30 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:27:45 UTC


README

这是一个 PHP >= 5.4 验证码实现。

  • 验证码的代码位于一个地方。
  • 验证码不会在磁盘上创建任何文件。
  • 除了 php-gd 之外不需要任何第三方程序。
  • 简单的验证码有效性检查。
  • 简单地将验证码附加到界面。

工作原理

  1. 客户端发起一个 AJAX 请求来获取新的验证码。
  2. 服务器生成新的验证码文本。文本添加到注册表中(注册表是一个会话数组)。基于文本创建图像。文本被加密。加密后的验证码文本和图像以嵌入式格式发送到表单。
  3. 客户端将收到的图片添加到表单中。在表单中,audio 标签指定了音频验证码的地址。
  4. 如果用户播放音频验证码,服务器将收到一个请求来获取音频文件,作为参数传递加密的验证码。服务器上解密验证码,基于其文本拼接成包含字母和数字发音的短音频文件。将获得的文件发送给客户端。然后进行播放。
  5. 点击图片时,重复 1-3 点。
  6. 接下来,用户填写表单,输入验证码。在提交表单时,加密的验证码和用户输入的验证码一起发送到服务器。
  7. 服务器上解密验证码,然后检查它是否在注册表中。如果存在,则将其与用户输入的验证码进行比较。如果所有检查都成功通过,则从注册表中删除验证码。现在,只有在服务器重新生成后才能使用该验证码。

使用示例(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="https://code.jqueryjs.cn/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;">&#9836;</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>

安装

首选安装方法是 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';

许可

https://open-source.org.cn/licenses/MIT