ホームページ  >  記事  >  PHPフレームワーク  >  laravelはGoogleクリック画像検証コードを実装します[推奨]

laravelはGoogleクリック画像検証コードを実装します[推奨]

藏色散人
藏色散人転載
2021-12-15 15:22:502148ブラウズ

Laravel の次のチュートリアルコラムでは、laravel-gridCaptcha を使用して Google のクリック画像と同様の確認コードをローカルに生成する方法を紹介します。

[拡張機能の推奨] laravel-gridCaptcha を使用して Google のドット イメージのような確認コードをローカルで生成する

はじめに

laravel-gridCaptcha PHP は、Google クリック画像検証コードに似た小さな拡張機能を生成します。部分的に生成された検証コードは、悪意のある攻撃者にとって簡単に識別できる一方、この一連の小さな拡張機能は非常にシンプルですが、ロボットの深い機械学習が必要となり、悪意のある攻撃のコストが増加します。 . Google 確認コードには機械学習が必要なため、対応するファイルをローカルで設定するだけで済みます。生成される検証コード イメージはファイルの読み取りによって生成されるため、キャッシュには Redis を使用することをお勧めします。コードはデフォルトでキャッシュを使用します。

ps: 如有不足之处,欢迎大佬提出修改意见。
Github: https://github.com/deleteDB/laravel-captcha-grid

Packagist: https://packagist.org/packages/deletedb/laravel-captcha-grid

プレビュー

laravelはGoogleクリック画像検証コードを実装します[推奨]

##インストール # #Laravel 8 以降をサポート:

 composer require deletedb/laravel-captcha-grid

設定項目の説明設定ファイルの公開

    php artisan vendor:publish --provider="Deletedb\Laravel\Providers\LaravelServiceProvider"
    config/gridcaptcha.php
    return [
        //生成验证码图片配置
        'image' => [
            //验证码图片路径
            'path' => env('GRID_CAPTCHA_IMAGE_PATH', storage_path('gridcaptcha\image')),
            //从验证码图片路径中获取的文件后缀名
            'suffix' => env('GRID_CAPTCHA_IMAGE_SUFFIX', 'jpg'),
            //生成验证码质量
            'quality' => env('GRID_CAPTCHA_IMAGE_QUALITY', 70),
            //生产验证码宽
            'wide' => env('GRID_CAPTCHA_IMAGE_WIDE', 300),
            //生产验证码高
            'high' => env('GRID_CAPTCHA_IMAGE_HIGH', 300),
        ],
        //验证码配置
        'captcha' => [
            //生成的验证码过期时间 单位秒
            'validity' => env('GRID_CAPTCHA_IMAGE_VALIDITY', 180),
            //验证码缓存的key
            'cache_key' => env('GRID_CAPTCHA_IMAGE_CACHE_KEY', 'grid_captcha'),
            //验证码生成的key长度
            'key_length' => env('GRID_CAPTCHA_IMAGE_KEY_LENGTH', 64),
            //自定义效验验证码key字段
            'key_string' => env('GRID_CAPTCHA_IMAGE_KEY_STRING', 'captcha_key'),
            //自定义效验验证码code字段
            'code_string' => env('GRID_CAPTCHA_IMAGE_CODE_STRING', 'captcha_code'),
        ],];
  • を使用して確認コードを生成します
      <?php namespace App\Http\Controllers;class TestController extends Controller{
        /**
         * 辅助函数生成验证码
         * @return array
         */
        public function helpers()
        {
            return grid_captcha([
                &#39;mobile&#39; => '100xxxxx121'
            ]);
        }
      
        /**
         * 门面方式生成验证码
         * @return array
         */
        public function facade()
        {
            return \Deletedb\Laravel\Facades\GridCaptcha::get([
                'mobile' => '100xxxxx121'
            ]);
        }
      
        /**
         * 对象方式生成验证码
         * @return array
         */
        public function object()
        {
            $captcha = new \Deletedb\Laravel\GridCaptcha();
            return $captcha->get([
                'mobile' => '100xxxxx121'
            ]);
        }}
    • - 生成结果```json5{
        "hint": "猴子",//提示文本
        "captcha_key": "Qh8kHYF4C....",//验证码key
        "image": "data:image/jpeg;base64,/9j/...."//base64验证码图片 -- 前端渲染显示}
    • 検証コード
         <!--
        
        生成的是一个九宫格图片,前端需要渲染图片,并且生成九个div用于记录用户点击的宫格位置,宫格位置从 0 开始,当点击到四位的时候返回给后端进行效验 ,因为前端技术拙劣我就不放例子了欢迎大佬补充。
        
        大概思路:
        -->
        <div>
            <!-- img 显示的是返回的验证码图片-->
            <img  alt="laravelはGoogleクリック画像検証コードを実装します[推奨]" >
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
        </div>
      • 効果:
      • <?php namespace App\Http\Controllers;use Illuminate\Http\Request;class TestController extends Controller{
        
            /**
             * 辅助函数方式效验
             * @param Request $request
             * @return array|false|\Illuminate\Http\JsonResponse
             */
            public function helpersCheck(Request $request)
            {
                /**
                 * 传参效验
                 */
                if ($captcha_data = grid_captcha()->check('Qh8kHYF4C....', '1540') === false) {
                    return response()->json(['message' => '验证码错误', 'code' => 401]);
                }
        
                /**
                 * 传递 Request 对象效验
                 */
                if ($captcha_data = grid_captcha()->checkRequest($request)) {
                    return response()->json(['message' => '验证码错误', 'code' => 401]);
                }
        
                return $captcha_data;
            }
        
            /**
             * 门面方式效验
             * @param Request $request
             * @return array|false|\Illuminate\Http\JsonResponse
             */
            public function facadeCheck(Request $request)
            {
                /**
                 * 传参效验
                 */
                if ($captcha_data = \Deletedb\Laravel\Facades\GridCaptcha::check('Qh8kHYF4C....', '1540') === false) {
                    return response()->json(['message' => '验证码错误', 'code' => 401]);
                }
        
                /**
                 * 传递 Request 对象效验
                 */
                if ($captcha_data = \Deletedb\Laravel\Facades\GridCaptcha::checkRequest($request)) {
                    return response()->json(['message' => '验证码错误', 'code' => 401]);
                }
        
                return $captcha_data;
            }
        
            /**
             * 对象方式效验
             * @param Request $request
             * @return array|false|\Illuminate\Http\JsonResponse
             */
            public function objectCheck(Request $request)
            {
                $captcha = new \Deletedb\Laravel\GridCaptcha();
                /**
                 * 传参效验
                 */
                if ($captcha_data = $captcha->check('Qh8kHYF4C....', '1540') === false) {
                    return response()->json(['message' => '验证码错误', 'code' => 401]);
                }
        
                /**
                 * 传递 Request 对象效验
                 */
                if ($captcha_data = $captcha->checkRequest($request)) {
                    return response()->json(['message' => '验证码错误', 'code' => 401]);
                }
        
                return $captcha_data;
            }}
        
            //效验完成正确后 您可以进行业务逻辑处理,比如可以获取到上方设置在验证码中的数据 如:上方设置的是手机号,您这里可以获取验证码中的手机号,当效验成功发送短信验证码等...

        laravelはGoogleクリック画像検証コードを実装します[推奨] 正常に返されました:検証の生成時に渡したデータが返され、空の場合はデフォルトで返される Array
        • 検証エラーが返される場合: false
        {
            "mobile" : "100xxxxx121"}
      • ローカリゼーション プロンプト
      • resources/lang/zh_CN/grid-captcha.php
        <?php 
      • //一个图片目录对应一个提示
        return [
          'banmaxian' => '斑马线',
          'gongjiaoche' => '公交车',
          'heiban' => '黑板',
          'honglvdeng' => '红绿灯',
          'hongzao' => '红枣',
          'houzi' => '猴子',
          'qianbi' => '铅笔',
          'shutiao' => '薯条',
          'xiaofangshuan' => '消防栓',
          'zhenglong' => '蒸笼',];
      • 新しい確認コード イメージを追加する
      • 例:

        pingguo

        タイプの新しい確認コード タイプ イメージを追加するには、それを

        image.path に追加する必要があります。構成ファイルの に名前を付けます。そのディレクトリの下に pingguo という名前のディレクトリを作成し、関連するタイプの画像ファイルを pingguo ディレクトリに保存します。新しいタイプには少なくとも 4 つの画像が必要ですファイル名は、構成ファイルで指定されている限り、次のようになります:

        ─storage
          └─gridcaptcha
              └─image
                  ├─pingguo
                  │       1.jpg
                  │       10.jpg
                  │       11.jpg
                  │       12.jpg
                  │       13.jpg
        "
      • 特別な注意事項

        ファイルの読み取りは I/O を消費するキャッシュ操作であるため、キャッシュには Redis を使用することをお勧めします。このツールはデフォルトでキャッシュを使用し、キャッシュには現在の検証コード イメージ ディレクトリ情報とイメージ。Redis キャッシュを使用するには、それを .env

        ファイル変更

        CACHE_DRIVER=redis に追加し、新しいファイルを追加した後、Redis 構成を追加するだけです。カテゴリの場合は、以前のキャッシュを削除することをお勧めします。削除しない場合は、キャッシュの有効期限が切れると自動的に更新されます。

        以上がlaravelはGoogleクリック画像検証コードを実装します[推奨]の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

        声明:
        この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。