スパマーに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探してしてトラックバックスパム飛ばすことくらい簡単である (少々プログラミングに覚えのある人ならすぐに思い浮かぶだろう)。
諸君! ここはひとつスパマーの気持ちになって考えてみようではないか。
- エントリーの中のURLを抽出して、さらに.cgi(.fcgi)+数字で終わっているアドレスを集める
(http://example.com/.{1,}\.(cgi|fcgi)\/[0-9]{1,}みたいな感じ) - 末尾の数字の部分を削除して各エントリーに共通のアドレスがあればトラックバックURLじゃねぇか? と判断する
- あるいはとにかく.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=" 送信する " />');
<script type="text/javascript" src="../../entry.jp"></script>
この部分はアクセシビリティというかJavaScript前提ってのが気になっていたわけだが、JavaScriptオフでも「確認」ボタン経由であればちゃんとコメント投稿はできるから矛盾は出ないだろう。もちろん機械的に「post」で投稿すれば投稿は出来てしまうが単にフォームをsubmitすれば良いわけではないからね。
これも前回行った対策だが、古いエントリーのトラックバックアドレス表示とコメントフォーム非表示、古いエントリーの再構築制限をかけたので、『比較的新しいエントリーで「トラックバックURL」「コメントフォーム」の判別が出来た』という条件を満たした場合のみスパムが飛んで来ることになる。
引き続き課題。
あとは...HTMLか。デフォルトのテンプレートにはClass名やIDにそれっぽい名前が振ってあるからソースを解析してアドレス抽出しやすいだろう。だからCSSと一緒にClass名等を推測しにくいものに変えてやれ…ってのはちと面倒なので次回とする。
もう徹底的にスパムと戦うというか...来るなら来やがれ!
関連エントリー
- スパムコメント・トラックバック対策というか考察というか。
- WWW上には4秒に1つのスパムサイトが産まれていて、15秒に1つのスパムサイトが閉鎖されている(嘘)。
- CGMはもうとっくに終わっていて今はSGMの時代。
- なるほどTrackbackスパムが多いわけだ。
その後の追記
その後ですが、やはり来ないですね。いまのところ。
Trackback Auto Discoveryの無効化は確かに有効。ただ結局のところ、スパムフィルターがどれだけ有効であろうとCGIが起動してフィルターが動作している限りサーバーの負荷は軽減されないわけです。そこがあんまり分かっていない人が多いような気がする。
↑事実正常なトラックバックが重くて受け付けられなかったら意味ないしね。現にHTTP error: 500 read timeout となって受け付けられないし。
ということで、5つのポイントとしてまとめます。内容はこのページの内容の殆どどのままですけど。