システムを悪用するためにロボットを作り出すハッカーの脅威への対応として、人間であることを確認するためのCAPTCHAの利用が生まれ、現在ではインターネット中で広く用いられています。この記事では、ZARZAのエンジニアがこの興味深いテーマについて論じ、正しい使い方と、推奨される代替策について具体的な情報を共有します。
CAPTCHAとは何であり、何の役に立つのでしょうか?
ウェブサイトに登録したり、フォームに入力したりするとき、私たちは歪んだ文字や、その名前を書くよう、正確に言えばその内容を書き写すよう求められる図形に出会います。そのとき私たちが目にしているのがCAPTCHAであり、その目的は、フォームを埋めているのがコンピュータープログラム(プログラムされたロボット)なのか、人間なのかを判別することにあります。
CAPTCHA: Completely Automated Public Turing test to tell Computers and Humans Apart
コンピューターと人間を区別するための完全自動化された公開チューリングテスト。それが私たちがCAPTCHAとして理解しているものであり、基本的には次のような見た目をしています。

ご覧のとおり、文字には変形が加えられています。これは自動ボットによる判別を難しくしつつ、人間には並びを識別できるようにするための工夫です。この例では「smwm」となりますが、統計によれば、すべての人にとってそれほど簡単なわけではありません。
文字の歪みに加えて、CAPTCHAには線やグラデーション、注意をそらす要素を含めて、難易度をさらに高めることもできます。
ただし、より現代的なCAPTCHAには、文字を音声で聞く選択肢や、内容が分からない場合に新しいCAPTCHAを試す選択肢が備わっています。たとえば、もっとも優れたものの一つはreCAPTCHA(現在はGoogleが所有)が無償で提供しているもので、次の例のように2つ以上の単語が組み合わされています。

CAPTCHAはこれからも複雑さを増し、ますます現代的になっていくでしょう。しかし、人間には理解でき、ロボットには理解できないという細い境界線は、常に存在し続けます。
CAPTCHAは完全に突破不可能なのでしょうか? いいえ、そうではありません。
現在では、ブラックハット・ハッキングを行う者も、ホワイトハット・ハッキングを行う者も、インターネット上で広められてきた画像認識ツールが存在することを知っています。さらには、ディープウェブの内外にある一部の有料サービスが、CAPTCHAを解読してシステムを侵害し、動作を遅くするための迅速な接続手段を提供しています。
以上の理由から、ソフトウェアを開発する際、あるいは開発を委託する際には、CAPTCHAはあくまで対策の一つにすぎず、対象のシステムを守るために行う唯一の管理策であっては決してならないと考える必要があります。
システムの構成によっては、次のような追加の推奨事項が考えられます。
- リクエスト数を制限する: IPアドレス単位でも、国別、時間別、リクエストの種類別でも制限します。こうしておけば、攻撃者がCAPTCHAを解読できたとしても、人間には物理的に不可能な別の限界にぶつかることになります。
- エラー回数を確認する: CAPTCHAを解読するために使われるスクリプトは、複数の可能性を含む配列を送信することが多く、通常の利用者が再試行し得る回数を超えるエラーにつながることがあります。これらのパラメーターを、ご自身の利用者の利用統計に応じて随時調整できるよう、開発者に(ご自身がプログラマーであればご自身に)依頼し、試してみてください。
- 利用者ごとにサービスを検証する: 構成上可能であれば、CAPTCHAの検証と同時に認証情報の検証を求め、あわせて利用状況を記録してください。そうすれば、手動でも自動でも排除できる不正利用者を容易に特定できます。
こうした要素は、実在する利用者にとって煩わしく感じられることも多いため、リクエストを完全にブロックする代わりに、たとえ数秒であっても待ち時間を設け、リクエストとリクエストのあいだに待たせ、成功した後も結果を受け取るまで待たせるという方法も検討できます。すべては利用者の振る舞いと、利用者の区分ごとに定めるポリシーに基づきます。既知の登録済み利用者と、訪問者や登録したばかりの利用者に、同じパラメーターを適用すべきではありません。
ZARZAのエンジニアにとって、ソフトウェア開発に関するあらゆるご要望にお応えすることは、これまでも、これからも喜びです。そして私たちの専門は、お客様のニーズを満たし、お客様を守り、お客様自身とインターネット上でのプレゼンスの成果を高めることであることを、あらためてお伝えしたいと思います。



メモを残す