PHP は単純な検証コード認識を実装します

WBOY
リリース: 2016-06-23 13:17:58
オリジナル
861 人が閲覧しました

ずっと書こうと思っていたのですが、久しぶりに興味が出たので記録することにしました。

検証コード

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート