このサイトでのスパム対策
Posted by amayadori on 2007/07/06(金) 12:37
Quote:
スパム
- SPAM: アメリカのHormel Foodsが販売するランチョンミートの缶詰。本項で詳述。
- spam: 受信者の意図を無視して送られて来る無差別大量一括送信メール(別名「迷惑メール」)の事を「スパム」("spam") と言う。スパム (メール)を参照。ニュースグループへの大量のマルチポスト・クロスポストのこともこの意味でスパムと呼ぶことがある。
- トラックバックスパム(ブログに対する迷惑広告など)
- IMスパム(インスタントメッセージによる迷惑メッセージ)
- 検索エンジンスパム(検索サイト・検索エンジンの検索結果に働き掛ける行為)
ここで言うところのスパムとはもちろん2.のspamのことである。
Drupalでサイトを開いたら、スパムのことも考えなければいけないでしょう。
ウィキペディアの項目にも上がっているとおり、最近はトラックバック機能を利用したスパムも多くなってきている。
それとは別に、以前からあるコメント欄を利用したスパムも依然として数が多い。
つい最近では、ユーザー登録をしてまでもスパムを残すなんてやっかいなモノまで現れているようです。
ひとえにスパムと言っても、スクリプトが機械的にやっているモノから人間が後ろで操作しているモノまであると思われます。
どちらにしても「あー言えばこー言う」じゃないですが、スパム対策を講じれば、それに対抗する手段を講じてきます。俗に言うイタチごっこです。
そうは言っても迅速かつフレキシブルにイタチごっこが展開されるわけではなく、それなりに時間がかかっているようですから、ある程度の時間は対策が有効に働きます。また、スパムにしても、迅速かつフレキシブルに対応していると合理的ではなくメリットが少なくなるという側面もありますからすぐには対策に対応してくることもないと思うので、同じようにある程度の時間は対策が有効です。
個々のケースで考えた場合、コメントスパムに関しては
- 信用できないユーザーには開放しない
では信用できるユーザーとは?
信用できると言う物差しは個人の感覚によるトコロなので置いておくとして、スパムという観点で考えた場合は一昔前まではメールアドレスを持っているかいないか?ということで線が引けたのですが、最近のスパムはメールアドレスまでちゃんと入力するらしいです。もちろん、それが有効なアドレスであるのかどうかは定かではありません。
実際に入力されたモノが有効なアドレスなのかどうかを確認しているスクリプトはないでしょう。そんなところを見透かされて、メールアドレスらしきモノを入力されてスパム対策は破られてしまっているのが最近の事情のようです。
Drupal本体でも、コメントの設定の中の「コメント投稿の設定」項目の中で、匿名のコメント投稿者(つまりは登録されていないユーザー)がコメントを投稿する場合には、コンタクト情報(つまり、メールアドレス)の入力を必須とするオプションがある。
これが、スパムへの対抗策なのだが、先に述べたようにアドレスが実在するかどうかをチェックしているわけではないので、それっぽいモノを入力されたら意味をなさなくなってしまいます。
そもそも、Drupalを始めとするウェブアプリケーションは、誰でも自由に入手することができるGPLやフリーソフトウェアですから、スパムも入手して研究することは可能ですから、ある意味デフォルトのままで利用していてはスパム対策には限界が生じるという見方もできるわけです。
Drupalを始めとする最近のウェブアプリケーションは機能を拡張するための仕組みを備えているモノがほとんどです。Drupalにもこの仕組みを利用してスパム対策を試みる機能拡張がいくつかあります。
- Captchaモジュール
Captchaとは、ロボットスパムに対抗するためにランダムな文字列をOCR解読されにくいが人間には判別できるレベルの画像として出力して、読み取った文字列を入力させて、その正誤によって、相手がロボットであるか、人間であるとと言う判断材料にしているモノが始まりであるようです。
DrupalにおけるCaptchaモジュールは簡単な演算(ランダムな数字の足し算)による認証問題を提供している。利用できる場所もコンテンツ作成時や、コメント投稿時、ログイン周辺など、Drupalのデフォルトの画面でしか利用できない。
Captchaモジュールも、開発当初は画像を利用したCaptcha認証の仕組みも内包していたようです1が、textimageモジュール2という別モジュールに分割されたようです。そのことによって、CaptchaモジュールはCaptcha認証を実現するAPIとでも言うべきモジュールを指向するように変遷してきたようです3。
このCaptchaのAPIを利用してオリジナルな問題を作成するモジュールもいくつか存在します。
- textimageモジュール
任意の文字列をエフェクトがかかった画像として出力して表示された文字列を入力させる方法を提供する。一般的に言うCaptcha認証。
- reCAPTCHAモジュール
音声認識を備えたCaptcha認証問題を提供するモジュールのようです。
- Captcha riddler(riddlerモジュール)
i18に対応して、環境に応じた問題を定義しておいて認証に利用する方法を提供する。
- randquest
前項Captcha riddlerモジュールを改造して作られたモジュールです。スミマセン<(_ _)>ワタシが作りました(泣)
riddlerは単一の問題しか定義できませんでした4。
当時、ワタシは0829@drupal.orgさんの影響を受け、Captchaそのものを日本語仕様5に改造していました。
riddlerの存在を知るまでに積み込んだ問題作成ロジックをそのままriddlerモジュールの改造という形で載せ替えました。
ワタシの作っていたモジュールはプロフィールモジュールの作成するフィールドをCaptcha認証のための問題文の格納に利用することで複数の問題文をランダムに切り替えてCaptcha認証を行えるようにしたモノです。 - Form store
Captcha認証の問題を作成するモジュールではないですが、Captcha認証を、Captchaモジュールが対応していないフォームにも表示できるようにするモジュールです。
- textimageモジュール
任意の文字列をエフェクトがかかった画像として出力して表示された文字列を入力させる方法を提供する。一般的に言うCaptcha認証。
- spamモジュール
Captchaモジュールは、コンテンツ作成時や、コメントの投稿時などに、ロボットスパムか否かを判断するためのいわば入り口を守る役割をしますが、それを突破されてしまった場合、もしくはトラックバックのように入り口がないに等しいモノからスパムを峻別するために活躍するのがspamモジュールです。
トラックバックはこちら側のフォームを経由しないのでCaptchaを表示することができません。そのため送られてきたトラックバックがロボットが発信したモノか否かという判断はできません。
そこで、送られてきたトラックバックの内容を監視して、キーワードや、アドレスをチェックしてスパムか否かを判定する仕組みです。
日本語オンリーのサイトで運用するという前提であれば、英文をサイトの中で使うことはほぼ稀だと思われますので、開き直って「日本語が含まれない場合6はスパムとして認定する」と言った設定をすることでかなりのスパムは峻別できます。
Drupal-J.comで実践しているスパム対策
Drupal-J.comでは、以下のようなモジュール構成で対策をしています。
- Captcha 5.x-2.2
- randquest 5.x-1.1
- spam 5.x-1.0
- Form store 5.x-1.0
spamモジュールのカスタムフィルタ機能にて「/^[^ぁ-ヶ]*$/u」を登録して、条件にマッチした場合は50%アップする様に設定しています。
コンテンツの作成はユーザーにも許可していない7ので、コメントの投稿、サイト向けコンタクトメール送信、新規ユーザー登録の各フォームにCaptcha認証を表示するように設定しています。提示される認証問題はrandquestモジュールによる日本語での画像認証や日本語で答えなければならない問題がランダムに選択されて出題されるようにしています。
トラックバックはモデレーション有りの設定にしています。日本語圏からの日本語によるスパムは自動判定することができないため、モデレーションにて判断することにしています。
スパム以外のトラックバックそのものが殆どないので、ま、いいやと言うことでのんびりやっています。
- 1. Drupal 4.6用モジュール
- 2. Drupal 4.7用以降
- 3. Captchaモジュール単体でも動作するように簡単な演算による認証問題を提供する部分は内包しています。
- 4. ridler 5.X-1.2まで。それ以降はランダム出題に対応したらしいです(未確認ですが)。
- 5. 英文ばかりの日本語圏以外からのスパム対策に特化した認証問題の作成
- 6. 日本語と言っていますが、漢字は中国などでも利用していますので、日本語にしかないひらがな・カタカナの有無が判断材料となります。
- 7. フォーラムを使っていないのでその代わりにブログをユーザーには開放しているが、基本的に皆さんサイトのオーナーさんなので、個々でブログが書かれることはないようです(^_^;)
トラックバック
URLから "-notspam" を削除してトラックバックを送信してください。トラックバックポリシーは こちらに提示しています。
いつも突っ込みを入れていただいて、ありがとうございます(笑)
あー、それは言ってはいけませんよ(笑)
他人の作ったモノは所詮、完全に理解することは出来ません。そう言うことから考えれば他人様が作ったモノを改造するなんて事の時点で、そう言うリスクは背負う訳ですから。それを言い出したらきりがなくなります。
オリジナルであろうが、改造であろうが、人間がすることに完璧と言うことはありません。
だいたいからして、randquestにしてもオリジナルであるriddlerを知ったときに既にtodoにおいてランダムでの問題切り替えに対応すると言うことは判っていたことなので、それをあえて改造しようという時点で重複していることになります。
もっとも、オリジナルは問題と答えをセットして、それを切り替えているだけで、動的な問題を作り出す仕組みは備えてませんけど。
i81n対応というのは売りかもしれませんね。ワタシのにはそんな仕組みは考慮していないので(^-^;△フキフキ
randquestはスクリプト上は日本語依存していないつもりなので、翻訳文を書き換えさえすれば日本語以外でも使えるとは思います(試してないので保証は出来ませんが)。
最新の曜日を訪ねるフォーマットもコアの翻訳から答えを作り出す仕掛けになっているのが良い例ですから。
今週の金曜日は何日?とか言うのも考えたのですが、全角の数字というのに変換する関数が日本語依存の関数だったので、そこの部分が解決できなかったので、今回は搭載しませんでした。曜日を訪ねるフォーマットと内部で切り替えて出題させようかと思ったんですけど、今回は保留しました(;_;)
問題文のフォーマットが種類が増えて複雑になってきているので、問題文のエラーチェックをしていない現在の仕様をなんとかしなきゃ・・・というのが今後の課題かなと思っています。
Captchajpはパクらせていただいているので・・・ありがとうございます<(__)>
このサイトのスパムの状況(とは言ってもトラックバックだけですが)をレポートにしてますが、海外からのモノが殆どです。
ですので、トラックバックはモデレーション有りにしておけばとりあえず、すぐ表には出ないですから、管理人が苦労すれば良いだけです。スパムチェックもspamモジュールのカスタムフィルタでかなり十分という感じです。
その他の投稿系はCaptchaで日本語の入力が必要な状態にしておけばとりあえずは十分かと思います。
ただし、出題フォーマットが固定的なCaptcha認証は必ず破られる可能性を秘めますから出題フォーマットそのもののランダム性はあった方がより強固にはなると思います。
Captchajpも、今まで考えたフォーマットをランダムで切り替えられるようにすればかなり強固になると思います。
ワタシのはある意味詰め込みすぎ(笑)
riddlerはオンメモリで問題文を保存しておくのに対して、ワタシのはDBに保存していますから、動作速度に差が出ます。どちらがいいのかは何とも言い難いところですが(^-^;△フキフキ
ま、何はともあれ、密かな楽しみを味わうキッカケをいただいた0829@drupal.orgさんには心より感謝しています(*^_^*)
こうやって、Captcha まわりのモジュールがまとめてあると参考になります。ありがとうございます。
私のサイトでは相変わらず「captchajp モジュール」+「Trackback モジュールの改変いろいろ」が頑張ってくれていますが、よく考えてみたら、自分で勝手に改変しているものばかりで、本当に大丈夫なのか?という感じですね…