勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでシンプルな英数字のCAPTCHAを「Gregwar / Captcha」ライブラリで実装する方法

  PHP

PHPでシンプルなランダム英数字のCAPTCHAを実装したい。「Gregwar / Captcha」というライブラリを導入することで簡単に実装できたので、以下にインストール及び利用方法のメモ。

 

Gregwar / Captcha

GitHub

https://github.com/Gregwar/Captcha

 

インストール

サーバにSSH接続し以下コマンドでインストールする。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
composer require gregwar/captcha
composer require gregwar/captcha
composer require gregwar/captcha

 

利用方法

1ページ内で完結させる場合

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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>
<?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>
<?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部分を分ける場合

フォーム側

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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>
<?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>
<?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側

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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();
<?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();
<?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

  関連記事

迷惑メール対策でフォームにGoogle reCAPTCHA v2を導入する方法

お問い合わせフォームのスパムメール対策としてreCAPTCHAを導入したいという ...

PHPでエラーメッセージを見やすくするwhoopsの利用方法

PHPのエラーメッセージが見づらい。これはこういうもの、と諦めていたがCodei ...

PHPで住所や名前のテキストをランダム生成するライブラリFakerPHPの使い方

PHPでランダムなデータを生成したい際に値段や点数等の数値やパスワード等のランダ ...

PHPでデータベースを取り扱いやすくなるORMライブラリ「idiorm」の利用方法

Codeigniterでデータベースを取り扱う際にクエリビルダクラスを用いて可読 ...

PHP Qr Codeライブラリを使用してQRコードを生成する方法

PHPでQRコードを生成したい。大分前にGoogle Chart APIを用いて ...

S