「あなた、人間ですか?」(スパム格闘記)

  • Facebook
  • Twitter
  • はてなブックマーク
  • Delicious
  • Evernote
  • Tumblr

あちこちのブログ等でリンクしていただいておりますと、多くの人に読みに来ていただけてありがたい反面、スパムコメントやトラックバックをバラ撒くプログラム(bot)にも多数お越しいただくことになります。


我がサーバのアクセスログを見ると、1秒に1件のペースで数百以上のこうしたスパムが書き込まれるのが常態となっておりまして、先日メールサーバがこけてご迷惑おかけしたのも、こうしたスパムを処理するためにサーバのキャパシティがパンクしたから、という次第であります。
先日とりあえずサーバーのキャパシティを上げることで対処しましたが、これは本質的な解決方法ではないので、週末来、スパムを効率的に処理する方法は無いものかなあと、あちこちのサイトを参考にさせていただいておりました。
「スパムかどうか」を判定するということは、「書き込みをするのが人間なのかプログラム(bot)なのか」を判別することとほぼ等しいと言えます。
このため、
「スパムをいかに排除するか。」
というのは、
「書き込みをしたのが人間かプログラムかを判別するアルゴリズムが存在するか?」
という判定問題に置き換えられますし、換言すれば、
「人間とプログラムの違いは何か?」
という、大変、哲学的な命題にもなりえます。

———————
人間とまったく区別がつかない人工知能が存在できないという理由は無いと思われますので、究極的に見れば、書き込みの方法や結果だけから機械か人間かを区別することはいつかは不可能になるはずですし、スパマーとブログ運営者の知恵比べも長期的には「いたちごっこ」なのは明らかなのではあります。しかし、現在の技術の下で、経済的にペイする方法でどうか、という前提条件をつけて考えてみると、この知恵比べは結構、楽しいですね。
今回採用した方法で、今まで1日に何千と来ていたスパムは、(少なくともこの48時間ほどの実績として)、なんと「ゼロ」になりました。
前述のとおり、我がサーバは24時間常にスパマーの巡回や書き込みにさらされていたので、サーバのモニターをすると、常にデータベースが「ゴウンゴウン」と音を立てて回っている感じで、CPUの稼働率もかなり高かったんですが、ここ2日ほどは、稼働率のモニターの画面は、ゼロに近い状況。ずっと鉄道の高架下で暮らしてきたのが、南の無人島で一人海面に映る月の光を眺めているような気分であります。
(これだと、サーバの増設も必要なかったかも。)
———————
ということで以下、技術的な話になりますが、ご参考までに、採用した方法や参考にさせていただいたサイトをご案内させていただきます。
(方法をご披露する、ということ自体、スパマーは個別にこうした日本語の文章を読んでまで個別のサーバごとの対応はしてこないだろうということを前提としておりますが・・・もちろん、これが永遠に続くとは限りません。)
スパマーに情報収集をさせない
スパムを書き込むにあたっては、ホームページなどで「情報収集」を行い、「トラックバックURL等の抽出」を行い、「書き込み」をするはずです。
書き込みされた後でスパムかどうかを判定する方法は、ベイジアンフィルター、ブラックリストなど、いろいろありますが、そもそも前述のように、サーバのキャパシティをほとんど奪われてしまうほどスパムが書き込まれる状況では、書き込まれてからさらに判定のスクリプトを回すというのでは、ますますサーバ資源を食ってしまうわけでして。
こうした問題意識にズバリ答えていただいているのが、このページ。

スパマーにCGI叩かれたら負けかなと思っている。
http://junnama.alfasado.net/online/2007/07/post_111.html

この野田さんのサイトを参考に、下記の対応をいたした次第です。
<$MTEntryTrackbackData$>を削除
実は、MovableTypeの標準のテンプレートには、<$MTEntryTrackbackData$>というタグが埋め込まれていて、生成されるhtmlやRSS、ATOMなどに(わざわざプログラムでも認識しやすいように)、トラックバックのURLを示す情報を埋め込んでくれてはるわけです。
これによって、人間の方も、「トラックバックの自動検知」でトラックバックしやすくなるわけですが、スパマーもURLを収集しやすくなるわけですから、人間のみなさまには、若干手間ですがURLをコピペしていただくとして、今回、このタグを全部削除させていただきました。
mt-tb.cgiのリネーム
MovableTypeの設定が書き込まれているmt-config.cgiに

TrackbackScript (新しい名前)*.*
CommentScript (新しい名前)*.*

という行を追加するとともに、標準のトラックバック・スクリプトである「mt-tb.cgi」とコメント・スクリプトの「mt-comments.cgi」をリネーム(名称変更)しました。
ログを見ると、スパマーはURLを収集するなんて面倒なことはせずに、「mt-tb.cgi/エントリーナンバー」という形で決めうちでpingを飛ばしまくっているのではないかという気もします。
また、実際、対策後のログを見ると、「mt-tb.cgi/エントリーナンバー」にPOSTしようとして、404(not found)のエラーになってしまっている履歴が、毎秒ズラズラズラーっと並んでます。
(へへーん。いい気味だ!)
「耳なし芳一」のように、全身に般若心経を書いてもらって「怨霊」からこちらが見えなくなったような気分であります。ただ、「怨霊」は未だまだ周りを大勢ゾロゾロ徘徊してますので、「お経の書き忘れ」がないかどうか不安。今のところ新しいURLにはアタックされてないですが。
.htaccessを変更
wwwサーバへのアクセスを制限するファイル「.htaccess」に、以下の記述を追加して、リネームしたスクリプトをGETコマンドで取得することを禁止しました。

AddType application/x-httpd-cgi (新しいスクリプトの拡張子)
<Files ~ “\.(新しい拡張子)$”>
<Limit GET>
Order Deny,Allow
Deny from All
</limit>
</Files>

実際、トラックバックURLにアクセスしていただくと、403 (forbidden)のエラーが出ます。
ただ、前述のとおり、スパマーが巡回してGETコマンドで情報収集しているかどうかは不明であります。
スパムコメント対策
上記のうち、トラックバック・スクリプトのリネームの効果は絶大だったんですが、コメント・スクリプトはリネームしても、スパムの書き込みにはあまり効果がなかった。(やや減った感はあるものの。)
ということで、効果のあるスパムコメントの対処法はないかとあちこち探し回りました。
MT4では、「CAPTCHAプロバイダ」が標準でついていますし、外部のCaptchaプロバイダも利用できます。
Captcha(キャプチャ)とは、「Completely Automated Public Turing test to tell Computers and Humans Apart」の略。ズバリ「コンピュータと人間を区別する完全に自動化された公開チューリングテスト」のことであります。
こんな文字列
captcha_rei.jpg
を入れるやつをご存知かと思います。これにしようかと決めかけていのですが、検索してみると、この方式はすでに10月ごろに破られているそうで。
Hannah Montana Battles the Bots(WSJ)
http://online.wsj.com/public/article_print/SB119153995723149557.html

For instance, companies like Ticketmaster require customers searching for tickets online to replicate a set of the squiggly letters and numbers, known as a “Captcha.” Theoretically, only human customers can correctly identify the characters despite the odd fonts, screening out automated purchasing programs. But RMG’s software, according to Mr. Kovach, can also “figure out the randomly generated characters and retype them automatically.” Mr. Kovach said RMG employees also gave him advice on fooling Ticketmaster’s computers into thinking his requests were coming from different Internet addresses.

それだけではなく、人間のみなさまにも読みにくい字を読んでいただいたり入力したりする手間を強いるし、前述のとおり、この処理のためにサーバ資源を食うというのでは本質的な解決になりません。
ということで、captchaはやめて、別の方法を探していたときに出会ったのが、あんちもん2さんが作成された「SbCode」というプラグイン。

SbCodeプラグイン – 技術情報
http://www.antimon2.atnifty.com/2007/02/sbcode_techinfo.html

基本的アイデアは、

  • コメント投稿フォームに、現在日時(表示時、秒単位)をハッシュ化した数値を隠しフィールド(<input type=”hidden” ?/>)として追加
  • コメント投稿時に、上記ハッシュからフォーム表示日時を割り出し、現在日時(投稿時)との間隔が指定期間内ならばOK

というシンプルなもの。
(ソースコードを全部読みこなして理解したわけではありませんが)、Captchaのように人間に文字列を入力する手間をおかけすることもないですし、(重そうな)画像処理プログラムを動かすこともない、というところが気に入りました。
「ハッシュ化の仕組みは独自仕様」「ソースは閲覧できる(Perlなので)」とのことですので、理論的には強度の問題も考えられますが、私のブログにスパムコメントを書き込むために、この独自仕様のスクリプトを解析しようというスパマーもいらっしゃらないかと。
今のところ、おかげさまでスパムコメント、ゼロであります。
ありがとうございます。>参考にさせていただいたサイトのみなさま。
(ではまた。)

[PR]
メールマガジン週刊isologue(毎週月曜日発行840円/月):
「note」でのお申し込みはこちらから。

3 thoughts on “「あなた、人間ですか?」(スパム格闘記)

  1. ITPro 「討論 “SOX”は病原菌か福音か」

    時々拝見しております「まるちゃんの情報セキュリティ気まぐれ日記」ですが、とても興味深かったので引用させていただきます。
     こんにちは、丸山満彦です。IT…

  2. > 人間とまったく区別がつかない人工知能が存在できないという理由は無いと思われますので、究極的に見れば、書き込みの方法や結果だけから機械か人間かを区別することはいつかは不可能になるはずですし
    これ論理的にちょっとおかしいですよね。人工知能が存在できないという理由は無い=判別がいつかは不可能になるはずっていうのはちょっと飛躍しすぎかなと思います。
    人工知能研究者の端くれとしてはこういうちょっとした部分に敏感に反応してしまいます。なぜなら人間と機械の打ち込むデータのパターンとしての明らかな違いはもちろん存在しますし、だけれどもそれが「何」であるかが明白でなく、もっと言うと、人間の本質とは何かが明らかでなく、一体人間とはなんなのか、意思とは何なのか、などを日々考えている身からするとそう簡単に言い切って欲しくはありません。
    人工知能の実現は可能であるかもしれないし、可能でないかもしれません。だけれどもそれは大変な考察と努力の上に成り立っているものなので、「どうせ人工知能もいつかはできるんだろうけど」などと軽々しく言って欲しくはありません。まぁいいんですけどね。科学なんてそんなもんですから。