質問: コメントスパムやトラックバックスパムによる過負荷を防ぐにはどうしたらいいですか。スクリプトを設置しない、MTをやめる、という回答は×。 MovableTypeと掲示板を設置していたら、毛唐から異常なほどのspamが毎日万単位で送信され、「サーバーが過負荷だからcgiを停止しました」と連絡が来ました。 そもそも、サーバーが過負荷になったのはspamテロリストどもの絨毯爆撃をくらったからであって、責任は100%、紅毛人スパマーにあります。スクリプトの更新やNG語の追加などできる限りのことはやってきましたが、それを上回る物量攻撃によって過負荷になったのです。 絨毯爆撃をくらったら、少なくともサーバーにアクセスはあります。CGIでスパム排除するとしても、CGIは動いてしまいます。 そこで質問です。何とかspam攻撃を有効に排除する方法はないのでしょうか。 .htacceessでIPで弾くのも、常時変化し続ける毛唐攻撃者のIPには対処できません。 できれば米軍には、スパマーをアルカイダ認定して空爆していただきたいところですが、スパムをCGIにたどり着かせないための専守防衛策を教えてください。
回答: WebサーバがApacheでしたら、CGI起動のプロセスに至らないようにするためには「.htaccess」での防御が主になると思いますが、「.htaccess」で弾くことが出来る条件は「IPアドレス」だけではありません。 ご自身のサイトのApacheアクセスログを閲覧することは可能ですか? まずは敵を知ることから始めなくてはならないと思います。 Apacheで一般的なcombinedログ形式でしたら... * ホスト名(IPアドレス) * リモートログ名(Ident) * 認証ユーザー名 * 時刻 * リクエスト内容 * ステータスコード * 転送量 * リファラ * ブラウザ名(User-Agent) ...が記録されていることと思います。 万単位で押し寄せて来るような迷惑行為の場合は、殆どの場合、自動化するためのツールを用いています。アクセスログからそれらの特徴を見抜くことで、完全ではありませんが被害を減らすことは可能だと思います。 例えば、自動投稿ツールのバグなのか、ブラウザ名として「**User-Agent:** Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)」という**すっとぼけた**痕跡を残していくマヌケな仕様のツールによるアクセスも数多く(私のところでも1日に数百アクセス)あります。まともなブラウザなら「User-Agent」なんていう文字列はブラウザ名に含まれません。 当然ながら、そんな奴らは... > > SetEnvIf User-Agent "User-Agent" spammer > > > Order deny,allow > > > deny from env=spammer > > > ...で追い出してしまえば良いわけです。 また、トラックバックの場合、真っ当なトラックバックであればブラウザを名乗るようなアクセスはあり得ません。そういった迷惑ツールを「運用していく中でアクセスログから見出して追記」していくだけで、相当な数のトラックバックスパムをCGI起動プロセスに至る前に排除することが出来ます。 (例:mt-tb.cgiがトラックバック受信用のCGIだとしたとき) > > > > > > > > SetEnvIf User-Agent "Mozilla/4\.0 \(compatible; MSIE 6\.0; Windows NT 5\.1\)" tb_spam > > > SetEnvIf User-Agent "Mozilla/4\.0 \(compatible; MSIE 5\.5; Windows NT\)" tb_spam > > > SetEnvIf User-Agent "Mozilla/5\.0 compatible /1\.00 \(i686-pc-linux\)" tb_spam > > > SetEnvIf User-Agent "Microsoft URL Control - 6\.00\.8862" tb_spam > > > Order Allow,Deny > > > Allow from all > > > Deny from env=tb_spam > > > > > > > > > (※参考 http://gigazine.net/index.php?/news/comments/20060901_trackbacks...) コンテンツが日本語メインでしたら、日本語を表示できないブラウザにはお引き取り願うという方法もアリだと思います。その際には、エラーメッセージで「日本語を表示できる環境にしてからアクセスしてね」というのを表示してあげれば、一応、来訪者側にも対処の余地があるってことで。迷惑投稿ツールは多分、画像で作成されているエラーメッセージの解釈はしないでしょう。 > > SetEnvIf Accept-Language "ja" Japanese_OK > > > Order Deny,Allow > > > Deny from all > > > Allow from env=Japanese_OK > > > ErrorDocument 403 /messages/HowToPost.gif #←ブラウザの言語設定の方法を説明した画像ファイル > > > ちなみに、SetEnvIfで弾いたアクセスが一般のアクセスログに混ざると腹立たしいので、 私は別ログに記録する形でログを分離させています。 さらに(極論ですが)、ユーザー名とパスワードを誰でも分かる場所に「公然と画像で掲示」しておいて、投稿用のスクリプトにBASIC認証をかけてしまうという方法を用いるとか。(BASIC認証はファイル単体にもかけられます。) > > > > > > > > AuthType Basic > > > AuthName "User=hoge Password=fuga" #←ここにも認証情報を宣言しちゃう...(^_^;) > > > AuthUserFile /path/to/.htpasswd # ←もちろん、あらかじめ作成しておきます。 > > > AuthGroupFile /dev/null > > > order deny,allow > > > require valid-user > > > > > > > > > 他にも正規表現を駆使したりとか、色々なアイデアがありそうですが...。 私は頭があまり良くないせいか思い付きません...(^_^;)