JavaScript を使ってスパムによる CGI の過負荷を防ぐ

Posted by
ぴろり
Posted at
2006/12/04 21:27
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
MovableType カテゴリ
カバーイメージ
  • Omamori
  • Photo by Japanexperterna.se
    • CreativeCommons
    • Attribution
    • ShareAlike

絨毯爆撃をくらったら、少なくともサーバーにアクセスはあります。
CGIでスパム排除するとしても、CGIは動いてしまいます。
そこで質問です。何とかspam攻撃を有効に排除する方法はないのでしょうか。
.htacceessでIPで弾くのも、常時変化し続ける毛唐攻撃者のIPには対処できません。

 このサイトでも様々なスパム対策を紹介していますが、その多くが CGI でスパムを弾くというものです。例えば、CAPTCHA はスパムに対して非常に強力ですが、この引用にあるように CGI への絨毯爆撃が行なわれるような場合には単なる負荷の一因になってしまいます。要は、如何にしてスパマーを CGI に近づかせないかということです。
 そこで JavaScript を使ってスパマーから CGI を隠蔽する方法を提案してみます。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

簡単な原理

 コメントスパムやトラックバックスパムは、「スパムボット」と呼ばれるプログラムを使って送信されています。スパムボットはスパム行為を行なうサイトやページをクロール(crawl)すると、取得した HTML を文字解析してコメント投稿用の CGI やトラックバック URL を取得し、その URL 目掛けてスパムコメントやスパムトラックバックを送信していると推測されます。
 以前、MovableType ではコメント投稿用の CGI (mt-comment.cgi)をリネームするなどの手段が有効でしたが、最近ではこの手法はほとんど効果がありません。なぜなら、リネームした後のファイル名が HTML に含まれてしまっているために、ページの HTML を文字解析すれば簡単に変更後のファイル名が知れてしまうからです。

 スパムボットはスパム対象のページを高々文字解析している程度と推測されます。そこで、この段階でコメント投稿用 CGI の場所が隠蔽できればスパムボットは CGI にアクセスできません。例えば次のようなフォームをスパムボットは正しくパスできないことになります。

現時点ではコストに見合わないという理由だけで、将来、このギミックを回避するスパムボットが登場する可能性は否定できません。

<form name="commentform" action="I_am_a_spammer.html">
  <input type="submit" />
</form>
<script>
  document.commentform.action = "./you_are_welcome.cgi";
</script>
<noscript>
  コメントを投稿するにはJavaScriptを有効にしてください
</noscript>

 人間がブラウザを通してアクセスした場合、commentform の送信先は you_are_welcome.cgi に変更されます。しかし実際のところ、この HTML をスパムボットと同様に文字解析だけを行なうと、フォームの送信先は I_am_a_spammer.html になり、HTML を見ただけではフォームの送信先が you_are_welcome.cgi とは判りません。スパムボットが JavaScript のように意味解析を行なえないと云う弱点を利用するわけです。

 ただ、この方法には問題もあって、JavaScript を解釈しないブラウザ(今はほとんど無いと思いますが)や、セキュリティ上の不安から JavaScript をオフにしているユーザも弾かれてしまうことがあります。そこで<noscript> タグを使って注意書きを併せておくと良いかもしれません。

MovableType のテンプレートを書き換える

 この手法を MovableType で利用する場合のテンプレートの書き方の例を示します。

<MTEntryIfCommentsOpen>
<form method="post" action="" name="comments_form">
  <input type="hidden" name="static" value="1" />
  <input type="hidden" name="entry_id" value="<$MTEntryID$>" />
  <p>
    <label for="comment-author">名前:</label>
    <input id="comment-author" name="author" size="30" />
  </p>
  <p>
    <label for="comment-email">メールアドレス:</label>
    <input id="comment-email" name="email" size="30" />
  </p>
  <p>
    <label for="comment-url">URL:</label>
    <input id="comment-url" name="url" size="30" />
  </p>
    <label for="comment-text">コメント:</label>
    <textarea id="comment-text" name="text" rows="15" cols="50"></textarea>
  </p>
  <input type="submit" name="preview" id="comment-preview" value="確認" />
  <input type="submit" name="post" id="comment-post" value="投稿" />
</form>
<script>
  // 本来の正しいURLに書き戻します。
  // ブラウザのJavaScriptが有効になっている必要があります。
  document.comments_form.action = "<$MTCGIPath$><$MTCommentScript$>";
</script>
</MTEntryIfCommentsOpen>

 未だに mt-comment.cgi を狙い撃ちしてくるスパムボットも存在するので、ファイル名の変更は忘れずに行なってください。合わせ技だからこそ効果的です。
 また「JavaScript 中に丸見えなのはやっぱり不安だ」と仰るのであれば、以下のように少し難解に書くこともできます。

<script>
  document.comments_form.action = ["<$MTCGIPath$>", "<$MTCommentScript$>"].join("");
</script>

トラックバック用CGIの保護 '06/12/07追記

 トラックバック ping の送信先URLも同じ方法で隠蔽することができますが、トラックバックスパムに関しては Trackback Auto Discovery 用のデータを解析していると推測されるため、あまり効果は期待できないかもしれません。なぜなら、コメント投稿用 CGI は form タグの action を取得すれば一発ですが、トラックバック ping の送信先URLについては一定のフォーマットが存在しないためです。そのため、トラックバック URL を隠蔽するには、その唯一のフォーマットである Trackback Auto Discovery 用のデータをエントリ中に埋め込まないというのが有効打ということになります。

参考: spam TrackBack対策ならTrackBack auto-discoveryを消すに限る

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。