アルファサード株式会社 代表取締役 野田 純生のブログ


スパマーにCGI叩かれたら負けかなと思っている。


公開日 : 2007-07-17 23:02:37


前回 (数日前) <$MTEntryTrackbackData$>も削除したしトラックバックとコメントCGIのリネームもしたわけで、今のところ殆どトラックバックスパムもコメントスパムも来ないわけだが...この間一通来やがった。

スパム防止プラグインの優秀さは認めるけれども実際のところCGIを叩かれること自体が嫌なわけだ。何故なら「言及の有無」を調べるためにCGI起動してトラックバック元へHTTP_GETしてソース調べて...って何でこっちがそこまでせなアカンのや? っていうか負荷かかりまくりである。

またトラックバック飛ばして「HTTP error: 403 Throttled」とか帰って来たら悲しいでしょ? 実際僕がトラックバック打ってもそうなっちゃうケース増えてるし。

ということで先日来トラックバックスパム系のプラグインを外すどころか各種設定も甘く甘くした。

mt-config.cgi


ThrottleSeconds 0
OneDayMaxPings 100
OneHourMaxPings 100

つまり...

CGI叩かれたら負けかなと思っている!

いくら<$MTEntryTrackbackData$>削除してもCGIもリネームしても、MTであることを決め打ちであるなら、機械的にCGIのURL探してしてトラックバックスパム飛ばすことくらい簡単である (少々プログラミングに覚えのある人ならすぐに思い浮かぶだろう)。

諸君! ここはひとつスパマーの気持ちになって考えてみようではないか。

  1. エントリーの中のURLを抽出して、さらに.cgi(.fcgi)+数字で終わっているアドレスを集める
    (http://example.com/.{1,}\.(cgi|fcgi)\/[0-9]{1,}みたいな感じ)
  2. 末尾の数字の部分を削除して各エントリーに共通のアドレスがあればトラックバックURLじゃねぇか? と判断する
  3. あるいはとにかく.cgi/数字のアドレスにGETリクエスト送ってそれっぽいレスポンスが帰って来たらトラックバックCGIだ! と判断できる

1 トラックバックの送信は、HTTP POSTメソッドを使う必要があります。

日本語版MT3.xならこんなレスポンス返ってくるから、それ確かめてからトラックバックスパム送りつければいいわけだ。簡単簡単!...

では対策。スパマーの心理(違!?)を読めば百戦して殆うからず!

トラックバックアドレスっぽくないURLを作る。GETアクセスを制限する。

まず、.cgi(.fcgi)以外の拡張子にしてしまおう。今回は.mtにしてみた(単純?)。さらにGETアクセスを弾く。

mt-config.cgi


TrackbackScript xxxxxxxxxx.mt
CommentScript xxxxxxxxxx.mt

.htaccess


AddType application/x-httpd-cgi .mt
<Files ~ "¥.mt$">
<Limit GET>
Order Deny,Allow
Deny from All
</limit>
</Files>

少し考えれば気づくと思うが、MTのTrackbackScriptの場合トラックバックIDの後にスラッシュ付けて後に適当なファイル名っぽい文字列くっ付けてもちゃんと機能するんだな。


<$MTEntryTrackbackLink$>/<$MTEntryBasename$>.html

出来たアドレスはこんな感じ。


/mt/xxxxxxxxxx.mt/1918/path2alias.html

ね、何だかただの静的ページに見えるでしょ? (見えない? mod_rerwiteを使う手もあるけどね)

コメント投稿ボタンをJavaScriptで挿入。

コメントについては前回「送信」ボタンをJavaScriptで挿入するようにした。


document.write('<input type="submit" accesskey="s" name="post" id="comment-post" value="&nbsp;&nbsp;送信する&nbsp;&nbsp;" />');

<script type="text/javascript" src="../../entry.jp"></script>

この部分はアクセシビリティというかJavaScript前提ってのが気になっていたわけだが、JavaScriptオフでも「確認」ボタン経由であればちゃんとコメント投稿はできるから矛盾は出ないだろう。もちろん機械的に「post」で投稿すれば投稿は出来てしまうが単にフォームをsubmitすれば良いわけではないからね。

これも前回行った対策だが、古いエントリーのトラックバックアドレス表示とコメントフォーム非表示、古いエントリーの再構築制限をかけたので、『比較的新しいエントリーで「トラックバックURL」「コメントフォーム」の判別が出来た』という条件を満たした場合のみスパムが飛んで来ることになる。

引き続き課題。

あとは...HTMLか。デフォルトのテンプレートにはClass名やIDにそれっぽい名前が振ってあるからソースを解析してアドレス抽出しやすいだろう。だからCSSと一緒にClass名等を推測しにくいものに変えてやれ…ってのはちと面倒なので次回とする。

もう徹底的にスパムと戦うというか...来るなら来やがれ!

関連エントリー


その後の追記

その後ですが、やはり来ないですね。いまのところ。

Trackback Auto Discoveryの無効化は確かに有効。ただ結局のところ、スパムフィルターがどれだけ有効であろうとCGIが起動してフィルターが動作している限りサーバーの負荷は軽減されないわけです。そこがあんまり分かっていない人が多いような気がする。

↑事実正常なトラックバックが重くて受け付けられなかったら意味ないしね。現にHTTP error: 500 read timeout となって受け付けられないし。

ということで、5つのポイントとしてまとめます。内容はこのページの内容の殆どどのままですけど。

カテゴリ
タグ


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ