PHPでシンプルな英数字のCAPTCHAを「Gregwar / Captcha」ライブラリで実装する方法
PHPでシンプルなランダム英数字のCAPTCHAを実装したい。「Gregwar / Captcha」というライブラリを導入することで簡単に実装できたので、以下にインストール及び利用方法のメモ。
目次
Gregwar / Captcha
GitHub
https://github.com/Gregwar/Captcha
インストール
サーバにSSH接続し以下コマンドでインストールする。
composer require gregwar/captcha
利用方法
1ページ内で完結させる場合
<?php require_once 'vendor/autoload.php'; session_start(); use Gregwar\Captcha\CaptchaBuilder; $builder = new CaptchaBuilder; $builder->build(); $is_valid = false; if( isset($_POST['captcha']) && $_POST['captcha'] == $_SESSION['captcha'] ){ $is_valid = true; } $_SESSION['captcha'] = $builder->getPhrase(); ?> <!doctype html> <html lang="ja"> <head> <title>CAPTCHA</title> </head> <body> <?php if( $is_valid ){ ?> 認証成功 <?php }else{ ?> <form action="./" method="POST"> <input type="text" name="captcha"> <img src="<?php echo $builder->inline(); ?>"> <button type="submit">認証</button> </form> <?php } ?> </body> </html>
こちらの方法だと1ページの実装で済むというメリットはあるものの、CAPTCHA部分のリロードができないというデメリットあり。特に今回のライブラリで表示されるCAPTCHA部分はかなり見づらいので注意。
フォームとCAPTCHA部分を分ける場合
フォーム側
<?php require_once 'vendor/autoload.php'; use Gregwar\Captcha\PhraseBuilder; session_start(); $is_valid = false; if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ if (isset($_SESSION['phrase']) && PhraseBuilder::comparePhrases($_SESSION['phrase'], $_POST['phrase'])) { $is_valid = true; } unset($_SESSION['phrase']); } ?> <html> <?php if( $is_valid ){ ?> 認証成功 <?php }else{ ?> <form method="post" method="./"> <img id="captcha_image" src="captcha.php" /> <button type="button" id="reload">リロード</button> <input type="text" name="phrase" /> <input type="submit" /> </form> <?php } ?> <script type="text/javascript" src="https://code.jquery.com/jquery-3.7.1.min.js"></script> <script> $(function(){ $('#reload').click(function(){ $('#captcha_image').attr('src', 'captcha.php?t=' + $.now()); }); }); </script> </html>
CAPTCHA側
<?php session_start(); require_once 'vendor/autoload.php'; use Gregwar\Captcha\CaptchaBuilder; $captcha = new CaptchaBuilder; $_SESSION['phrase'] = $captcha->getPhrase(); header('Content-Type: image/jpeg'); $captcha->build()->output();
こちらの方法だとCAPTCHA部分をリロードできる。実運用の際はこちらの方が無難かと思われる。
関連記事
-
-
迷惑メール対策でフォームにGoogle reCAPTCHA v2を導入する方法
お問い合わせフォームのスパムメール対策としてreCAPTCHAを導入したいという ...
-
-
PHPで画像を比較して類似度を算出する「image-comparator」ライブラリの利用方法
PHPで画像の類似度を計測したい。ただ、そのためのロジックが全く分からないためラ ...
-
-
PHPにて「php-ulid」ライブラリを用いてULIDを生成する方法
先日MySQLにてUUIDを発行するメモを書いたがUUID v1だと生成時間によ ...
-
-
PHPで画像アップロード、リサイズ、形式変換(jpg->webp等)はclass.upload.phpが便利
今までPHPで画像関連の処理を行う場合、リサイズの時のみsmart_resize ...
-
-
PHPでダミー画像(プレースホルダー画像)を表示する「PHP-Dummy-Image-Generator」の利用方法
先日JavaScriptでダミー画像(プレースホルダー画像)を表示する「Hold ...