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部分をリロードできる。実運用の際はこちらの方が無難かと思われる。
関連記事
-
-
PHPでルーティング用ライブラリ「AltoRouter」の利用方法
PHPフレームワークのCodeIgniterを勉強していた際にルーティング機能が ...
-
-
PHPで住所や名前のテキストをランダム生成するライブラリFakerPHPの使い方
PHPでランダムなデータを生成したい際に値段や点数等の数値やパスワード等のランダ ...
-
-
CodeIgniter4 & reCAPTCHA でお問い合わせフォームを作成する方法
以前CodeIgniter4.4.4で簡易的なお問い合わせページを作成したが、今 ...
-
-
phpdotenvライブラリを使用してPHPで.envファイルを読み込ませる方法
CodeIgniterを勉強していた際に各種設定は「.env」というファイルに記 ...
-
-
PHPでvar_dumpをツールバー形式で表示するライブラリ「Kint」の使い方
PHPでvar_dumpを見やすくするためにdBugライブラリを利用しているが、 ...