ずっと書こうと思っていたのですが、久しぶりに興味が出たので記録することにしました。
CAPTCHA
コンピュータと人間を区別するための完全に自動化された公開チューリング テスト (CAPTCHA) (一般に CAPTCHA として知られる) は、コンピュータと人間を区別するための完全に自動化された公開チューリング テストです。ユーザーをコンピューターや人間と区別するプログラム。 CAPTCHA テストでは、サーバーとしてのコンピューターが、ユーザーが回答するための質問を自動的に生成します。この質問はコンピュータによって生成および判断できますが、答えることができるのは人間だけです。コンピュータは CAPTCHA の質問に答えることができないため、質問に答えるユーザーは人間であると考えることができます。
百科事典の紹介
簡単に言うと、ランダムに生成された文字が画像上に出力されます [他の形式のドラッグ アンド ドロップや SMS 認証コードなどはここでは考慮されません]。
一般的なタイプ
アイデア
この記事はデモのみを目的としているため、最初の画像の確認コードは次のとおりです。例として説明します。
画像上のすべての点には RGB 値があり、カラー ピッカーから取得できます。検証コードが次のとおりであることが肉眼で確認できます。画像は純粋なデジタル ソリッド カラーです。背景
カラー ピッカーを通じて、検証コードの背景色の RGB 値が次のとおりであることがわかります。 (212,214,204)
実装
PHP の imagecolorsforindex
関数を使用して、画像内のすべての点の RGB 値を取得しましょう:
$url = 'http://210.32.33.91:8080/reader/captcha.php'; $im = imagecreatefromgif($url); imagegif($im, '1.gif'); $rgbArray = array(); $res = $im; $size = getimagesize($url); $wid = $size['0']; $hid = $size['1'];for ($i = 0; $i < $hid; ++ $i) { for ($j = 0; $j < $wid; ++ $j) { $rgb = imagecolorat($res, $j, $i); $rgbArray[$i][$j] = imagecolorsforindex($res, $rgb); } }
結果
これは何に使うのですか? データの表示方法、出力方法を変更しましょう。背景色は #、検証コード領域は
で、もう一度見てみましょう:
for ($i = 0; $i < $hid; $i ++) { for ($j = 0; $j < $wid; $j ++) { if ($rgbArray[$i][$j]['red'] == 212) { echo '□'; } else { echo '■'; } } echo "<br>"; }
効果:
##もう分かりましたか?
しかし、まだ疑問があるかもしれません。目で見ることはできますが、その量をどうやって知ることができますか?
以下で分析してみましょう:
各認証コード間の距離は 4 スペース、左右のスペースは 6/10 スペース、上下のスペースは 16/10 スペースです。
より明確に見えるように、これらの干渉ポイントをもう一度削除しましょう:
非常に明確ですか? まだ疑問に思う人もいるかもしれません。画像上の数字が何であるかをどうやって知ることができますか?
わかりました、私のアイデアをお話しましょう。
と # を 0 と 1 に置き換えてみましょう。これらの数字の形は固定されているため、0 ~ 9 を取得できます。各単語 8*10 の各領域は、0 と 1 で構成されます。 ## 8 セグメントごとにもう一度実行し、4 つのスペースの間隔を削除し、ループして 0 ~ 9 の 01 の組み合わせ値を取得します。
$dic = array( '00011000001111000110011011000011110000111100001111000011011001100011110000011000' => 0, '00011000001110000111100000011000000110000001100000011000000110000001100001111110' => 1, '00111100011001101100001100000011000001100000110000011000001100000110000011111111' => 2, '01111100110001100000001100000110000111000000011000000011000000111100011001111100' => 3, '00000110000011100001111000110110011001101100011011111111000001100000011000000110' => 4, '11111110110000001100000011011100111001100000001100000011110000110110011000111100' => 5, '00111100011001101100001011000000110111001110011011000011110000110110011000111100' => 6, '11111111000000110000001100000110000011000001100000110000011000001100000011000000' => 7, '00111100011001101100001101100110001111000110011011000011110000110110011000111100' => 8, '00111100011001101100001111000011011001110011101100000011010000110110011000111100' => 9);
Get These図10に示す画像RGBを配列として結合し、画像RGBを解析して対応する配列値に置き換えるたびに検証コード値が得られる。以下にデモを行ってみましょう:
検証コード認識 !
笑、精度は100%です最後に書きました
この記事の目的はWEB開発を容易にするため、認証コードを生成する際は安全性に十分注意し、不正な目的には使用しないでください
コードは github にあります:https://github.com/chaclee/sf