ずっと書こうと思っていたのですが、久しぶりに興味が出たので記録することにしました。
Computers and Humans Apart (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>";}
効果:
とても明確になりましたか?
しかし、まだ疑問があるかもしれません。それは見えますが、どのようにしてその金額がわかるのでしょうか?
以下で分析してみましょう:
各確認コードは、左右に 6/10 のスペースが 4 つずつ配置されています。スペース、および上部と下部の 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);
これら 10 個の事後組み合わせを配列に取得し、毎回画像の RGB を分析します。これを対応する配列値に置き換えて、検証コード値を取得します。以下にデモをしてみましょう:
最後に、精度を高めるために、100 回ループして見てください:
はは、精度は 100% です
この記事の目的は、WEB を許可することです開発者は検証コードを生成する際は安全に注意し、違法な目的には使用しないでください
コードは github にあります: https://github.com/rainwsy/sf