ホームページ >バックエンド開発 >PHPチュートリアル >PHP による検証コード認識の実装 (プライマリ)_PHP チュートリアル
最近、認証コードの突破に関する知識を調べて記録しました。これは、私自身の理解を助けるために過去数日間に学んだ知識の要約である一方で、この側面を勉強している技術系の学生にとっても役立つことを願っています。ウェブサイト管理者の注意を引き、確認コードを提供する際にさらに考慮してもらいたいと考えています。この側面の知識に触れたばかりなので、私の理解は比較的単純なので、間違いは避けられません。
検証コードの機能: ハッカーが特定のプログラムを使用して総当たり攻撃を行うことにより、特定の登録ユーザーに対して継続的にログインを試行することを効果的に防止します。実際、最新の検証コードは一般に、マシンがバッチで登録したり、マシンがバッチで応答を投稿したりすることを防ぎます。現在、多くの Web サイトでは検証コード技術を使用して、ユーザーがロボットを使用して自動的に登録、ログイン、スパムを送信することを防止しています。
いわゆる認証コードは、ランダムに生成された数字または記号の文字列から画像を生成するもので、ユーザーは (OCR を防ぐために) 認証コード情報を肉眼で識別できます。フォームを作成し、検証のために Web サイトに送信すると、機能を使用できるようになります。
最も一般的な確認コード
1. 4 桁、ランダムな 1 桁の文字列、最も原始的な認証コードであり、認証効果はほぼゼロです。
2. ランダムなデジタル画像検証コード。絵上の文字は非常に規則的で、ランダムなインターフェロンが追加されているものや、文字の色がランダムなものもあるため、検証効果は以前のものより優れています。グラフィックや画像の基礎知識のない人には突破できません。
3. さまざまな画像形式の乱数 + ランダムな大文字英文字 + ランダムな干渉ピクセル + ランダムな位置。
4. 漢字は登録用の最新の認証コードであり、ランダムに生成されるため、入力が難しくなり、ユーザー エクスペリエンスに影響を与えるため、一般に使用される頻度は低くなります。
わかりやすくするために、今回の説明の主な対象は 2 番目のタイプです。まず、インターネット上でよく見られるこのタイプの確認コードの写真をいくつか見てみましょう。
これら 4 つのスタイルは、基本的に 2 で説明した検証コードの種類を表すことができます。最初は、最初の図が最も解読しやすく、2 番目が 2 番目、3 番目がより困難、4 番目が最も困難であるように見えます。
本当の状況はどうなっているのでしょうか?実際、これら 3 種類の画像の解読は同様に困難です。
最初の画像が最も簡単です。画像の背景と数字は同じ色を使用し、文字は規則的で、文字の位置は同じです。
2枚目の絵は難しそうに見えますが、実はよく調べてみると、背景の色やインターフェロンがどんなに変化しても、文字は規則正しく同じ色であることが確認できます。文字以外の色素がすべて除去される限り、インターフェロンは簡単に除去できます。
3枚目は上記のように背景色やインターフェロンが変化するほか、検証文字の色も変化し、それぞれの文字の色も異なるようです。この確認コードを突破することは不可能と思われます。この記事では、学生が自分で作成できるこのタイプの確認コードを例に挙げます。
4 番目の図では、3 番目の図で説明した機能に加えて、干渉率の 2 本の直線がテキストに追加されています。これは難しそうに見えますが、実際には簡単に削除できます。
検証コードの認識は一般に次の手順に分かれています:
1.フォントを取り出します
2.二値化
3. 特徴量を計算する
4. コントロールサンプル
1:フォントを取り出します
結局のところ、検証コードの識別は専門的な OCR 認識ではなく、Web サイトごとに検証コードが異なるため、最も一般的な方法はこの検証コードの署名ライブラリを構築することです。フォントを削除する場合は、すべての文字がこれらの画像に含まれるように、さらにいくつかの画像をダウンロードする必要があるため、ここにある文字には画像しか含まれていないため、0 ~ 9 を含む画像のみを収集する必要があります。
2:二値化
2値化とは、写真上の検証番号の各ピクセルを1、それ以外の部分を0として数値で表現することです。このようにして、各デジタル フォントを計算、記録し、キーとして使用することができます。
3: 特徴量を計算する
識別対象画像を二値化して画像特徴を取得します。
4: コントロールサンプル
手順 3 の画像特徴コードと検証コードのフォント パターンを比較して、検証画像上の数字を取得します。
現在の方法では、認証コードの認識率は基本的に 100% になります。
上記の手順を経ても、インターフェロンを除去する方法がまだわかっていないと言うかもしれません。実際、インターフェロンを除去する方法は非常に簡単です。インターフェロンの重要な特徴は、検証コードの表示効果に影響を及ぼさないことです。そのため、インターフェロンを作成する際、その RGB は、次のように特定の値よりも低い場合もあれば、高い場合もあります。私が挙げた例では、インターフェロンのRGB値は125を超えないため、インターフェロンを簡単に除去できます。
PHPコード
[php]
定義('WORD_WIDTH',9);
定義('WORD_HIGHT',13);
定義('OFFSET_X',7);
定義('OFFSET_Y',3);
定義('WORD_SPACING',4);
クラスバリテ
{
パブリック関数 setImage($Image)
{
$this->ImagePath = $Image;
}
パブリック関数 getData()
{
$data を返します。
}
パブリック関数 getResult()
{
$DataArray を返します。
}
パブリック関数 getHec()
{
$res = imagecreatefromjpeg($this->ImagePath);
$size = getimagesize($this->ImagePath);
$data = 配列();
for($i=0; $i < $size[1]; ++$i)
{
for($j=0; $j < $size[0]; ++$j)
{
$rgb = imagecolorat($res,$j,$i);
$rgbarray = imagecolorsforindex($res, $rgb);
if($rgbarray['red'] <125 || $rgbarray['green']<125
|| $rgbarray['青'] < 125)
{
$data[$i][$j]=1;
}その他{
$data[$i][$j]=0;
}
}
}
$this->DataArray = $data;
$this->ImageSize = $size;
}
パブリック関数 run()
{
$結果="";
// 查找 4 桁
$data = array("","","","");
for($i=0;$i<4;++$i)
{
$x = ($i*(WORD_WIDTH+WORD_SPACING))+OFFSET_X;
$y = オフセット_Y;
for($h = $y; $h < (OFFSET_Y+WORD_HIGHT); ++ $h)
{
for($w = $x; $w < ($x+WORD_WIDTH); ++$w)
{
$data[$i].=$this->DataArray[$h][$w];
}
}
}
// 行关键字合わせ
foreach($data as $numKey => $numString)
{
$max=0.0;
$num = 0;
foreach($this->Keys as $key =>$value)
{
$パーセント=0.0;
同様のテキスト($value, $numString,$percent);
if(intval($percent) > $max)
{
$max = $パーセント;
$num = $key;
if(intval($percent) > 95)
壊す;
}
}
$result.=$num;
}
$this->data = $result;
// 查找最佳適合数字
$result を返します。
}
パブリック関数 Draw()
{
for($i=0; $iImageSize[1]; ++$i)
{
for($j=0; $jImageSize[0]; ++$j)
{
echo $this->DataArray[$i][$j];
}
エコー「/n」;
}
}
パブリック関数 __construct()
{
$this->Keys = array(
'0'=>'0001110000111111100110001101100000111100000111100000111100000111100000111100000111100000110110001100111111100001 11000'、
'1'=>'0001110000111110000111110000000110000000110000000110000000110000000110000000110000000110000000110000111111110111 11111'、
'2'=>'0111110001111111001000001100000001110000001100000011000000110000001100000011000000110000001100000000111111101111 11110'、
'3'=>'0111110001111111101000001100000001100000011000111110000111111000000011100000001110000001101000011101111111000111 11000'、
'4'=>'0000011000000111000000111000001111000011011000011011000110011000110011001111111111111111110000011000000011000000 01100'、
「5」=>
「111111110111111110110000000110000000110000000111110000111111100000001110000000111000000110100001110111111100011111000」
'6'=>'0001111000011111100110000100110000001100000001101111001111111101110001111100000111100000110110001110111111100001 11100'、
'7'=>'01111111101111111100000001100000001000000011000000110000000100000001100000001000000011000000011000000110 00000'、
'8'=>'00111110001111111001100011001100011001110111000111110000111110001110111011000001111000001111100011101111 11100'、
'9'=>'00111100001111111011100011111000001111000001111100011101111111100111101100000001100000011001000011001111 11000'、
);
}
保護された $ImagePath
保護された $DataArray
保護された $ImageSize
保護された $data
保護された $Keys
保護された $NumStringArray
}
?>
サンプルを作成しました。ここからダウンロードできます http://www.BkJia.com/uploadfile/2012/0316/20120316110154186.rar
上記の検証コードを解読した後、snoopy (curl より軽いので気に入っています) を使用してブラウザをシミュレートし、Web サイトにアクセスできます。