私が登録することを決めたとたんに、私は彼らの新しい絡み合ったキャプチャを見ました。
Captchaは非常にシンプルに思えました(ただし、独創性セグメントがないわけではありません)。
したがって、captchaは、3つの数字と碑文を含む画像です。
図はランダムな順序で表示され、軸に沿った歪みや位置の変化はありません(図のタイプと順序のみが変更されます)。 円(円)、正方形(正方形)、三角形(三角形)、十字(x)の4つの数字があります。
図の下に碑文が表示され、どの図を選択するかが示されます。
このすべての「奇跡」は、ファイルlogin.bogi.ru/captcha.phpにあり、標準のphpGDライブラリによって表示されます。ファイルサイズは170x95pxで、PNGと入力します。
登録はGET HTTPリクエストの送信時に行われます(この場合はXHRですが、置換のチェックがないため問題ではありません):
bogi.ru/auth/registration?first=FIRST_NAME
&last=LAST_NAME
&nick=NICK
&email=EMAIL
&password=PASSWORD
&sex=1
&captcha=1
&sid=
&ajax=1
&target=http%3A%2F%2Flostfilm.tv%2F
電子メール、パスワード、captcha、およびsidフィールドに最も関心があります。
sidを介して、認証が実行されるcaptcha識別子が渡されます。
captchaパラメーターは、図1、2、または3の番号を指定します。
キャプチャ画像へのフルパスは次のようになります。
login.bogi.ru/captcha.php?sid=a0vxd4rgs0gsz5gh38gan903sac
登録ページのソースコードから、たとえば非表示のsidフィールドから画像を取得します。
$reg = "/name=\"sid\" value=\"([^\/]+)\"/";//<input type="hidden" name="sid" value="7cf6e89e9ee5dd19cdae1328208198" /> preg_match($reg, $site_html, $sid); $sid = $sid[1];
画像を受け取ったら、その分析に進むことができます。
まず、画像全体を2つの領域に分割しました。
1)形状
2)碑文
数字も碑文も歪んでおらず、その位置も変わらないため、それぞれの場合に行列を構成するのは簡単です(4 * 2 = 8行列)。
たとえば、次のように:
for($x=0; $x<$width; $x++) { for($y=0; $y<$height; $y++) { $color[$x][$y] = imagecolorat($img, $x, $y); //sign if($y > 70) { $sign[$x1][$y1] .= ($color[$x][$y]==2147483647?0:1); $y1++; } //FIGURE 1 if($y > 10 && $y < 40 && $x > 20 && $x < 50) { $figures[0][$f0x] .= ($color[$x][$y]==16777215?0:1); } //FIGURE 2 if($y > 10 && $y < 40 && $x > 70 && $x < 100) { $figures[1][$f1x] .= ($color[$x][$y]==16777215?0:1); } //FIGURE 3 if($y > 10 && $y < 40 && $x > 120 && $x < 150) { $figures[2][$f2x] .= ($color[$x][$y]==16777215?0:1); } } if(count($sign)){$x1++; $y1=0;} if($x > 20 && $x < 50) $f0x++; if($x > 70 && $x < 100) $f1x++; if($x > 120 && $x < 150) $f2x++; }
ここでは、3つの数字($数字)のマトリックスと碑文($記号)のマトリックスを作成します。 背景色(図の場合は白、碑文の場合は透明)を0に、残りを1に置き換えます。
結果は次のような行列です。
残っているのはそれだけです。すべての図と碑文のマトリックスバンクを作成し、解析した画像を以前に保存したマトリックスと比較する必要があります。図の番号を設定して、キャプチャを解決できます。
調整コードは非常に簡単です。
if($sign == $signs['x']) { if($figures[0] == $drawings['x']){$result = 1;} elseif($figures[1] == $drawings['x']){$result = 2;} elseif($figures[2] == $drawings['x']){$result = 3;} else{$result = 0;} } elseif($sign == $signs['circle']) { if($figures[0] == $drawings['circle']){$result = 1;} elseif($figures[1] == $drawings['circle']){$result = 2;} elseif($figures[2] == $drawings['circle']){$result = 3;} else{$result = 0;} } elseif($sign == $signs['square']) { if($figures[0] == $drawings['square']){$result = 1;} elseif($figures[1] == $drawings['square']){$result = 2;} elseif($figures[2] == $drawings['square']){$result = 3;} else{$result = 0;} } elseif($sign == $signs['triangle']) { if($figures[0] == $drawings['triangle']){$result = 1;} elseif($figures[1] == $drawings['triangle']){$result = 2;} elseif($figures[2] == $drawings['triangle']){$result = 3;} else{$result = 0;} }
ここで、$記号はラベルのマトリックス、$図面は図のマトリックスのセット、$記号は現在のラベル、$図は現在の図のセットです。
その結果、ピクチャ番号(または解析できなかった場合は0)を取得します。
あとは、登録リクエストを送信するだけです。
$regURL = "http://bogi.ru/auth/registration?first=TestBot&last=Bot1a&nick=bot".substr(uniqid(), 0, 5)."&email=bot".substr(uniqid(), 0, 5)."@gmail.com&password=qwerty123&sex=1&captcha=".$result."&sid=".$sid."&ajax=1&target=http%3A%2F%2Flostfilm.tv%2F"; $data = file_get_contents($regURL);
それに応じて、
callback({"error":0,"text":""});
それはどういう意味ですか? 登録は正常に完了しました 。 」
このキャプチャは非常に信頼性が低く、経験の浅いプログラマでも短時間で簡単に解読でき、ボットやスパマーからサイトを保護したい場合に使用する価値があることは確かです。
PS一般に、このキャプチャを「クラック」するのに約1時間かかり、1つの画像を解析するのに約5秒かかります(解析と登録とともに)。 念のために、私はそれらに進捗報告書を送りました。 LostFilmをサポートしてから、Houseの10エピソードを見に行きました。