PHPでCAPTCHA(画像認証)を自作してみた。
二ヶ月ぐらい前に、PHPのCAPTCHAライブラリ(securimage)を使って実装してみました。
PHPで簡単にCAPTCHA認証(画像認証)を導入する方法
簡単に出来るのは良いのですが、CAPTCHA画像を生成するのが重くてイマイチ感が…。
解析しようと思ったのですが、思ったより規模が大きかったので、むしろ自作してみました。
参考にしたサイト
PHPスクリプト無料配布所 :: PHP.TO
http://php.to/tips/8/
サンプルもダウンロード出来るのですが、わりと文法エラーがあったり(^_^;)
自作するにあたって、突破されづらい画像認証に必要な要素をリストアップしてみました。
1,画像サイズがそれなりに大きい(小さいと総当りが容易になる)
2,フォントを変更する(今回はIPAフォント6種類を使用)
3,文字を少し歪める(PHPではやり方が分からなかったので未実装)
4,文字を回転(画像自体もわずかに回転させた)
5,文字サイズを不規則(基本)
6、文字の表示位置がランダム(基本)
7,文字の色をわずかに変える(ほぼ黒だがRGBを少しイジる)
8,文字数に幅を持たす(5~6文字位が適当かな?)
9,背景画像は単調で無くす(最低限、同じ背景は止める)
10,リロードされたら違う文字にする(Submitされて間違った時も変更する)
11,表示してから制限時間をつける(5分位?これは未実装)
これらを考慮して作成したソースが、こちら。
このまま実行すると画像を吐き出すだけなので、入力フォーム用HTMLファイルを用意する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <title>画像認証</title> </head> <body> <img src="./create_captcha.php" alt="captcha_image" title="captcha_image" /> <form id="captcha_form" name="captcha_form" method="post" action="ans.php"> <input type="text" id="captcha_text" name="captcha_text"> <button type="button" onclick="location.reload();">リロード</button> <button type="submit" value="送信">送信</button> </form> </body> </html> |
最終的にOK/NGを判定するPHPファイルも用意
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // セッション開始 session_start(); //文字化け防止に、言語と文字コードを明示的に指定。 mb_language("Japanese"); mb_internal_encoding("UTF-8"); //画像認証があっているか? if($_SESSION['captcha_auth'] === $_POST['captcha_text']){ echo "OK!!"; }else{ echo "NG!!"; } |