Captchaの仕組み(説明用画像)
Captchaは現在、フリーフォーマットを保護するための最も一般的な方法の一つです。もともとデータの安全性を守るためではなく、スパム対策や人間であることを認識するために作られたものです。
しかし、機械で生成されたものなので、必ずしも完璧ではありませんが、キャプチャーテストの成功率は99%前後で、よくできたスパムロボットで解読できる画像は1%程度です。
仕組み
他にもオプションがあり、例えば私はこのソリューションを使っています。
- サーバーは、ユーザーがフォームページを要求したという情報を受け取り、フォームページの生成を開始する。
- 未来のキャプチャテストフィールドには、何も書いていない秘密のアドレス(乱数、文字列、...何でもいい)が書かれた画像が置かれます。
- そのアドレスに画像が生成され、保存されます。同時に、正しいトランスクリプトがどこかに書き込まれます(おそらくセッションやデータベースに)。
- ユーザーがフォームを送信する際に、入力した内容と一致するかどうかがチェックされます。その場合、フォームが処理されます。そうでない場合は、別の画像の再描写を依頼する。
- 成功した場合も失敗した場合も、一時的なキャプチャ画像は削除されます(2度と使用できません)。一定時間内に送信されないと、そのフォームも削除されます(失効)。
正しい転写
キャプチャテストを解くことができれば、ユーザーは人間である可能性が高い。しかし、タスクを解決できないユーザー、特に目の不自由なユーザーのことを考えるのは良いことです。複数の可能なテストを組み合わせるのは良い解決策です(特に音声プリフェッチ)。しかし、現状では画像から読み取るよりも、機械による音声認識の方が圧倒的に効率的です。そのため、この解決策は必ずしも理想的とは言えません。
カスタムシンプルキャプチャ画像
ある寸法の空白の画像を生成し、そこに数文字を入力すれば、それ以上編集することなく読みやすくなることがよくあります。マジかよ!?ほとんどのスパムボットは愚かで、より優れたOCRで完璧に読み取れるテキストであるにもかかわらず、この種の保護機能を持つ一般的なフォームを攻撃することができないのです。
出来上がった画像は、次のようになります。
<img src="captcha.php" alt="ukázková captcha">
何度かページを更新してみると、その都度コードがランダムに変化しているのがわかると思います。デモのため、保存せずに生成しているだけなので、読み込んだらすぐに削除されます。
事実上すべてのPHPインストールとホスティングで利用可能なPHPGDライブラリを使ってソースコードを解いたのです。
Header("コンテンツタイプ:image/png");$obr = ImageCreate(100, 35);$pozadi = ImageColorAllocate ($obr, 219, 28, 49); //背景色の定義$bila = ImageColorAllocate ($obr, 255, 255, 255); //テキストの白色定義$styl = array ($pozadi);ImageSetStyle ($obr, $styl);$nahodne_cislo = rand(11111,99999); //5文字の乱数抽選imagestring($obr, 5, 25, 10, $nahodne_cislo, $bila); //テキスト(ここでは数値)を描画する関数です.ImagePNG($obr); //画像をメモリに生成してレンダリングするImageDestroy($obr); //メモリから画像を削除する(一度生成した画像はもう必要ないので).
画像のレンダリングは、あとはHTMLの問題です。
<img src="captcha.php">
このスクリプトは、さらに手を加えないと、それ自体では機能しないことに注意してください。あくまで簡単な画像を生成するためのデモとしてご利用ください。
概要
Captchaテストはかなり信頼性が高いが、煩わしく、時間がかかる。そのため、javascriptで別の画像を読み込むオプションをユーザーに提供すると、ページ全体を再読み込みする必要がなく、すべてを再度入力する必要がありません。
覚えておいてください。人間にとっては些細なことでも、機械にとっては決して実現可能な解決策ではないかもしれません。そのため、完全に読み取れるテキストを使ったこの原始的なキャプチャでも、半分以上のスパムを防ぐことができるのです。