RECENT POSTS

TWITTER UPDATES

CGIリネームの定期自動実行をしてスパム対策になるかどうかの実験をしてみました。 トラックバックスパムやコメントスパム対策については大きく分けると以下の2つの方法が取られていると思います。

  • スパムをフィルタリングするプラグイン
  • トラックバックやコメントのCGIファイルをリネーム
私は両方でやってきましたが、一番理想的なのは後者だと思っています。 なぜなら、スパム業者はサイトを訪問することなくMTのCGIのファイル名を決め打ちで送りつけてくるからです。 来ると分かっているものに対してはプラグインでフィルタリング動作させるはサーバの負荷という面では良くない。 CGIリネームをしておけば、そもそもサーバにスパムが来ても存在しないURLに対してくるわけで、せいぜいWEBサーバのログに残るくらいです。 (サーバのログ例)

——————— httpd Begin ———————— A total of 16 unidentified ‘other’ records logged with response code(s) POST /mt/mt-tb.cgi/34 HTTP/1.0 with response code(s) 4 404 responses←存在しないURLにアクセスがあって404レスポンスを返しているPOST /mt/mt-tb.cgi/42 HTTP/1.0 with response code(s) 1 404 responses POST /mt/mt-tb.cgi/26 HTTP/1.0 with response code(s) 1 404 responses

CGIが動作するまでもないわけです。(ざまーみろ、という感じですね(笑))

そして、リネームされていても通常の正当な(?)訪問者によるコメントやトラックバックはサイトに表示されている、あるいは埋め込まれているリネーム後の CGIに対して来るので問題ない。 けど、このCGIリネーム、しばらくすると一部スパム業者は巡回ツール等を駆使してリネーム後のCGI名を拾ってしまい、またスパムが来始めます。 (実際、やはり2週間くらいしたらリネーム後のCGIにスパムが来始めました。) ということで、週に1度くらいの頻度でCGIを自動的にリネームできないか考えてみた。

CGIリネーム自動処理の内容

  • CGIをリネーム

    ・初回実行時:現在のCGIのファイル名に2桁の数字を付加する。

    (例)現在のトラックバックCGIが「mt-tb.cgi」なら「mt-tb00.cgi」

    ・2回目以降:現在のCGIのファイル名にある2桁の数字をカウントアップする

    (例)現在「mt-tb00.cgi」→「mt-tb01.cgi」

    ・その他:数字が99まで到達したら00に戻す

    (例)現在「mt-tb99.cgi」→「mt-tb00.cgi」

    以後、同様なルール

    という、非常にシンプルなリネームルールです。(^^ゞ
  • mt-config内のCGI指定スクリプト名をリネーム後のものに変更
  • サイトを再構築(トラックバックURL用テンプレートとコメントURL用テンプレート(後述)のみ再構築するため数秒で終了する)
これらを週1度くらいの頻度で自動的に行うわけです。 大抵スパム業者側も自動的に巡回ツールを使ってトラックバックURLなどの自動収集をしても即反映できるわけではなさそうなのでまずは週1回くらいで様子見。。 しかし、サイトの再構築は負担になるので、CGIを指定している部分をインデックステンプレート化し、エントリアーカイブはこれをphpで読み込むと、このインデックステンプレートのみ再構築すれば良いので長くても数秒で終わります。 ということで、この手順を書きます。

前提

  • MTのバージョンは3.2以上(3.1系や最新の3.3でも大丈夫だとは思いますがまだ試してません(^^ゞ)
  • ブログをPHP化してあること
  • cronが使えること(XREAのレンタルサーバや、自宅サーバ(系)なら可能)

準備

念のためいつでも元に戻せるようにしておくと安心して先に進める。
  • エントリアーカイブテンプレートのバックアップ  テンプレートを開いて、中身をPC側のメモ帳にでも貼り付けて保存しておく
  • トラックバックCGI、コメントCGIのバックアップ  ローカルにダウンロードしておく(mt-tb.cgiとmt-comments.cgiの2つ)
  • コンフィグファイルのバックアップ  ローカルにダウンロードしておく(mt-config.cgi)

コメントCGI、トラックバックCGIの読み込み用テンプレート作成

参考:たねちゃんズ12: スパム止まっちゃった



たねちゃんさん、感謝!!m(_)m
  • mt-config.cgi の TrackbackScriptとCommentScript を有効にするために、頭の# を消して mt-tb.pl の部分をそれぞれtrackback.cgiとcomment.cgi に書き換える。そして mt-config.cgi をサーバーのmtディレクトリへアップロードする。
  • MTのテンプレート画面を出し、「新規テンプレートの作成」をクリック。 まずはトラックバックURLのテンプレートから。
    • テンプレートの名前:trackback_url
    • 出力ファイル名: trackback_url.php
    • 中身:
      <$MTCGIPath$><$MTTrackbackScript$>/  ←改行なし(最後にスラッシュ付きで)
      
    次はコメントURLのテンプレート
    • テンプレートの名前:comment_url
    • 出力ファイル名: comment_url.php
    • 中身:
      <$MTCGIPath$><$MTCommentScript$>  ←改行なし(スラッシュもなし)
      
    として保存し、これらのテンプレートを再構築する。

エントリアーカイブの修正

エントリーアーカイブのテンプレートを開いて
<$MTEntryTrackbackLink$>
と、
<$MTCommentScript$>
この変数の部分を探し出して、それぞれを下記に書き換える
<?php readfile("<$MTBlogSitePath$>trackback_url.php"); ?><$MTEntryTrackbackID$>
<?php readfile("<$MTBlogSitePath$>comment_script.php"); ?>

mt-rebuild.plの取得とアップロード

ダウンロードはこちらから

引数としてパラメータを渡すだけでMTの再構築を行ってくれるPerlスクリプトがあります。 後述するシェル「cgi_rename.sh」はこのスクリプトを呼び出して再構築を行うので、ダウンロードして、MTのディレクトリにアップロードしておきます。

cgi_rename.shの取得、編集後アップロード

bashで書いたスクリプト「cgi_rename.sh」です。

mt-rebuild.plと同様にMTのディレクトリにアップロードしておきます。

※シェルスクリプトの拡張子「.sh」をhttpd.confなどで実行可能にしている場合は他人がブラウザから実行できてしまいますので、実行不可能にするか、Apacheが実行できないディレクトリにアップロードする必要があります。

(通常は実行できないのでMTのディレクトリでOK)

これをcronで呼び出して以下のことを行います。

(再掲)

  • CGIをリネーム

    ・初回実行時:現在のCGIのファイル名に2桁の数字を付加する。

    (例)現在のトラックバックCGIが「mt-tb.cgi」なら「mt-tb00.cgi」

    ・2回目以降:現在のCGIのファイル名にある2桁の数字をカウントアップする

    (例)現在「mt-tb00.cgi」→「mt-tb01.cgi」

    ・その他:数字が99まで到達したら00に戻す

    (例)現在「mt-tb99.cgi」→「mt-tb00.cgi」

    以後、同様なルール

    という、非常にシンプルなリネームルールです。(^^ゞ
  • mt-config内のCGI指定スクリプト名をリネーム後のものに変更
  • サイトを再構築(トラックバックURL用テンプレートとコメントURL用テンプレート(後述)のみ再構築するため数秒で終了する)
ダウンロードはこちらからアップロード後、「mt-rebuild.pl」と「cgi_rename.sh」の両方に実行権限「755」を付けるのを忘れずに。。

cronの設定

  • 自宅サーバなどでcrontabを使って編集する場合
    crontab -e
    
    としてcronの編集を行う 毎日午前3時にリネームして再構築する場合

    00 03 * * * /var/www/html/mt/cgi_rename.sh

    毎週月曜午前3時にリネームして再構築する場合

    00 03 * * 1 /var/www/html/mt/cgi_rename.sh

  • XREAのレンタルサーバなどでブラウザからcronの自動実行を編集できる場合 申し訳ありませんが、XREAは使ったことがないのでXREAでのcronの設定方法は別途お調べ願いますm(._.)m

動作確認

まずは、数分後に起動されるようにcronを編集して、その時間を過ぎてから、実際にサイト上のエントリを表示/リロードしてみる。
  • トラックバックURLのリネーム確認 エントリのトラックバックURLが表示されている部分を見て

    この記事のトラックバックURL:http://example.jp/mt/trackback00.cgi

    のようにトラックバックURL内のCGIの名前に2桁の数字が付加されているか確認して下さい。

  • コメントCGIのリネーム確認 ページのソースを表示して、「method」などで検索

    <form method="post" action="http://example.jp/mt/comments00.cgi"~

    のようにコメント用のCGIに2桁の数字が付加されているか確認して下さい。

自宅サーバなどの場合で直接シェルスクリプトが実行できる環境であれば、直接「cgi_rename.cgi」を実行して確認できます。 また、自宅サーバなどの場合でcronの実行した場合にメールが送られてくる環境であれば、

メールのタイトル(例):Cron /usr/local/bin/cgi_rename.sh メール本文(例): TrackbackScript will be renamed to trackback06.cgi from trackback05.cgi rebuild start !! rebuld finished !!

のように実行後にメールが送られてくるようになるので確認の意味にもなります。

複数ブログを運用している場合

複数のブログを運用している場合でも下記のようにちょっと変更すれば、一度の自動リネーム実行で全部のトラックバックURL、コメントCGIが変わります。 ●エントリアーカイブのテンプレートを修正 要は、メインのエントリアーカイブテンプレートと同様に、トラックバックURL、コメントURL用のテンプレートを読み込めば自動的に塗り変わるので、以下のようにします。 エントリーアーカイブのテンプレートを開いて
<$MTEntryTrackbackLink$>
と、
<$MTCommentScript$>
この変数の部分を探し出して、それぞれを下記に書き換える
<?php readfile("メインブログのindex.phpがあるローカルパス(例:/var/www/html)/trackback_url.php"); ?><$MTEntryTrackbackID$>
<?php readfile("メインブログのindex.phpがあるローカルパス(例:/var/www/html)/comment_script.php"); ?>
直接メインブログのローカルパスを記述しないとダメですが、MTの変数タグではメインブログのローカルパスを引いてくるものはないので、仕方ないです。。 (CGIディレクトリならメインのものが<$MTCGIPath$>で引けますが。。)

おわりに

これでサーバに負荷をかけることなく、また、正当なトラックバックやコメント者に影響を与えることなくスパムを受け付けないようにすることができたものと思われる(笑)。 但し、中には準スパム業者というか、広告や宣伝の目的でサイトを正当に訪問してからトラックバックやコメントをする業者も日本にはいます。(トラックバックやコメントの内容は決してそのエントリと関連していないものも多いので、準スパムとみなす) それらについては「正当な手順を踏んでいる」だけに防ぎようはありません。 しかし、無差別的にスパムを行う業者については非常に有効な手段だと思います。 唯一落とし穴があるとすれば、cronが自動実行されるタイミングの時に正当な訪問者がコメントやトラックバックを行おうとして、CGIがリネームされてしまったことには気付かずにエラーになる場合がありますが、正当な訪問者であれば、再度コメントやトラックバックを行ってくれるでしょう(^^ゞ (そのためにもcronは自分のサイトのアクセス履歴などを見て、比較的アクセスが少ない時間帯に設定しましょう。大体月曜の夜中3時~朝5時あたりが狙い目でしょうか。どっちにしてもこのスクリプトの実行時間は10秒もかからない処理なので、非常に有効だと思っています) 上記内容は充分に確認を取ったものですが、万が一動かない場合はコメントなどでお知らせ下さい。m(._.)m スパム業者も日々進化しているのだろうけど、とりあえずこれでしばらくはがそもそも不要なスパムフィルタリング処理に翻弄されなくて済む日々が続くことを願う。。

こちらもご一緒にどうぞ!

30 Responses

  1. たねちゃん より:

    Kazuさん…きったねぇなぁ(笑)


    CRONの使い方を書かれたら、私は嫌でもCGIリネームの進化版を

    書かなければいけない状況に追い込まれてしまうやないかい!(笑)


    でもKazuさん、このエントリーに1つ突っ込み所をハケーンした!

    コメントURLのテンプレートの最後、スラッシュ[/]いらないお(笑)

  2. Kazu より:

    ええ、追い込ませていただきやしたっ(笑)

    でもよく考えたらこのエントリを見てる人がいる以上このまましばらくこれで行かざるをえんばい。。

    確かにスラッシュいらんどす。あざーすm_O_m

    ところでたねちゃんさん、頂いたトラックバックがどうしてもジャンクに入ってしまいますねぇ。

    それこそもうスパムのプラグイン外してもいいかもだけど(←過信しまくり)

    そういえばMT-Notifierちゃんと来ます?

    自分で試すと、TypeKeyでサインインしてると届かない(笑)

  3. たねちゃん より:

    Kazuさん、こんちょわ(笑)


    なんかちょっと、CRONを使う事になりそうな気配がしておりますわ。

    で、それに関連して、リネームCGIがまた進化しております。がぁ!?

    もぉ週末も終わりなんで、いつ発表出来るかは未定です!さらにぃ

    今度はCRON使った方法で公開したいので、あおらないでください(笑)

    私のトラックバックがjunkに逝くのは niku.2ch.net のリストにIPが

    載ってるからなので、niku.2ch.net を外すだけで良いかと思うょ…

    MT-Notifier は全然来ませんよ(笑)私、常にTypeKey使ってるし(笑)

    いずれ、暇な時に私も MT-Notifier 入れて試すつもりなんだが…

  4. Kazu より:

    たねちゃんさん、にょわ(・ω・)ノ 


    じゃーあおっちゃおうかな~(笑)

    MT-Notifierは文字化けするわ、TypeKeyだと来ないわ、なんか今にも外しそうな勢いですので、たねちゃんさん、宜しくお願いします(笑)

    nikuだけ外してみますた。

  5. たねちゃん より:

    Σ( ̄□ ̄;)あ…MT-Notifierの実験忘れてたわぁ(笑)


    ところでKazuさん、折り入ってお願いがあるんでござんすが。

    CRONに何をさせるか?を昨日思い付いて、Kazuさんのshファイルを

    ベースに作り変えようと思ったんだけど…ソース見ても全然分からへんorz

    んでKazuさん、ちと私の思い付いたやつをshファイルで作ってぇ!?

    多分Kazuさんがshファイルでやってる事よりは簡単…だと思うんだが

    これを作る為には、今の私のトコのCGIリネームの仕組みが分からないと

    出来ないかな!?とりあえず、こんなんなんですけど、どぉでっしゃろ?(笑)

  6. Kazu より:

    いいっすよ!シェルなら任せとき!毎日仕事でいじってるし。

    CGIリネーム、その後どうっすか?

    うちは結局1日起きにリネームすることで今のところスパムは

    皆無ですわ。

    たねちゃんさんのCGIリネーム、一度導入してみたいので

    そのうちやってみます(笑)

    で、どんなシェル?

  7. Kazu より:

    MT-Notifierはもう動いたり動かなかったり愛想尽きた(笑)ので

    外しました。

    たねちゃんさん今度入れてみてー。(笑)

  8. たねちゃん より:

    にょわ(・ω・)ノ←これ気に入った(笑)


    シェルを仕事でイジってるって…そぉ言う仕事だったのかぁ…

    CGIリネーム完全版をここにトラックバック送っておきました。

    シェルを作ってもらう為にも1度導入してみてくださいな(笑)

    で、どぉ言うシェルか?って言うのはメールで言う方が良い?

    それとも、このコメントに書いて大暴露した方が楽か?(笑)


    MT-Notifierは…いつか実験しておくよ(笑)

  9. Kazu より:

    どわ(^0_0^)

    いや、そういう仕事というか、IT関連なら何でもやるというか

    これがPerlでバリバリ何か組む仕事だったならMTのプラグイン

    もバシバシ作るのだが、Perlはいまいち分からん(>_

  10. たねちゃん より:

    にょわ(・ω・)ノ


    私Perl読めるし、CGIも作るけどさ、プラグイン作れませんorz

    シェ、シェルを早く作ってほすぃなぁ( つД`)と、あおっておく。

  11. たねちゃん より:

    にょほ(・ω・)ノ獅子丸だワン!


    さて、ならCRONでやってほしい事を長文で説明していきますかね。

    2つのファイルに数字の羅列が3箇所出力されてる訳なんですが、この

    この中の日(%d)、曜日(%w)、月(%m)、年(%y)をCRONを実行した時の

    時間に書き換えて欲しいです。実行時の時間として得られるのか

    現在の時間で得られるのかは分からないけど、多分得られるよね?

    で、書き換える場所をどぉ判断するのかが興味津々なんだけど

    これらの数字がバラバラに配置してあるので面倒臭度で決めてちょ。

    日だけ、日と曜日、日と曜日と月、日と曜日と月と年の4パターンで

    どれか好きな分を選んで書き換えるシェルを作ってください。


    3440605081409を8月11日に実行すると5440605081411って感じで。

  12. Kazu より:

    こんばんにゃ


    とりあえず、こちらに置いてみましたので試してみてくださーいな!

    実行権限を付与するのを忘れずに!

    その他注意点、特になし!(笑)

  13. たねちゃん より:

    Kazuさん、作ってくれてありがとね( つД`)


    なんだけど、全然動かないんでちょと調べてみたら…orz

    ウチのサーバーはbin/shかbin/cshしか動かない様だ。んでね

    そこにplの実行のさせ方が載ってたから、自分でpl作ってみた。

    CGIで動かしてみたら成功したので、これをCronにやらせると…

    まったく成功する気配が無い!しかも1時間に1回しかテストが

    出来ないし、設定し直すと反映されるのに1時間掛かるって言うし。

    なんかウチのCronは頼りにならん!でもまだ、私には奥の手がある

    ので、それで実行させようと思う。いちおー今こんな状況だすぅ。

  14. Kazu より:

    ええええ!?

    bashが動かないLINUXでつか。。

    shでも動くかも知れませんが、kshじゃないと無理かな。。

    んで、どーやって動かすんですか?(奥の手とは・・・?)

    うちのほうは無事夜中に実行されていて、目下無敵状態です(笑)

  15. たねちゃん より:

    いーなー、無敵状態って言えるトコがうらやましかぁ…


    あぁ、どぉやって動かすか?って…ちっ、これ企業秘密なのに…

    私が昔作ったCGIが今も動いているのは知ってると思うが、その中に

    アクセスアナライザーを入れてあって、さらに検索ボットを分類する

    様に作ってある。それで集めた情報を見ると…Yahoo!の検索ボットが

    毎日来てるのよね。もぉ分かっただしょ?Yahoo!の検索ボットが

    私のサイトに来ると実行する様にするの(笑)これで毎日自動実行に

    なるでしょ?もし来なかったら他の検索ボットでも反応する様に

    しておけばいいだけだし!簡単な事だしょ?(笑)

  16. Kazu より:

    shでも動くようにしましたけど、もう遅い?

    (上のコメントの同じURLで参照可!)


    なるほど、それは確かに企業秘密っぽいアイデア

    ですね( ̄Д ̄;;

    でもやっぱりcronで動かしてみまへん?

    だって、夜中に動いたほうが誰かがコメントや

    トラックバック送ろうとしているときに実はスクリプト

    が変わってたっていう可能性が飛躍的に減りますですし。。

  17. たねちゃん より:

    にょほ(・ω・)ノ


    KazuさんがそこまでCronで動かして欲しいと言うって事は当然

    最後までサポートするって覚悟があっての事なんでしょうね?(笑)

    sh用のやつを取って入れてみました。が、惜しいトコまで動いた。

    書き換え成功メッセージが出たんだけど、実際は書き換えて無い。

    それと、心配してるスプリクト変更の懸念なんだけど、Kazuさんの

    作ってくれたのを見て、中に一部perlになってるから読めたんだが

    Cron実行時の日時に書き換えてしまうだろぉなってのは気付いてた。

    だから私、書いたじゃない!日、曜日、月、年を書き換えてと(笑)

    時分秒が元のままなら、1日に1回しか変更されなくなると思って…

    私が作ったCGIは時分秒をそのまま残す様にしてあるからねぇ~!

    あぁ、つまり早くCGIを公開しろと…で、それをKazuさんがシェルに

    組み込めば良いって事ね…orzはい、出来るだけ早く公開します…

    ちょっとCronのメールとか見て欲しいから、まとめてメールするね。

  18. たねちゃん より:

    あーすっげぇ大変だった…orz


    Kazuさん、やっと動いたよ( つД`)ちゃんと書き換えもOK!

    ってか、1日待ってちょ。と言っておきながら、30分後にもぉ

    修正版を出してくるトコはまさに、私とソックリな性格だ(笑)


    でもやっぱ、OSはちゃんとLinuxってなってるのよねぇ…XREAの

    サーバーはよぉ分からん。やっぱMyサーバーが良いのかもね!

    とりあえず、お疲れ様&ありが㌧ござる!後でエントリー書いて

    トラバ送っておきます。しかしこのエントリー、コメントのせいで

    なっがいエントリーになってしまいましたなぁ(笑)

  19. Kazu より:

    無事動いたようでよかったよかった(笑)

    いや、基本でしょう(笑)>30分後に修正版 

    ま、XREAがLINUXと言ってるならLINUXなんでしょう。

    でも、このCron版がいいか、CGI版がいいかは

    たねちゃんさんご自身で決めてくださいな(笑)

    なんとしてもそちらのサーバでも動くようにして

    みたかったってのが大きかったので(^^;

    逆にお手数かけまひた。。m(._.)m

  20. たねちゃん より:

    おひさしぶり~ふ(・ω・)ノ


    私のブログの方でコメント返しましたが、CGIリネームの熟成版を

    組み込んで稼動させています。今回の熟成版はトラバURLを見ると

    「!?」と思う事うけあい!トラバURL見た後にコメントCGIを見ると

    分かる人は分かるし、分からない人にはサッパリ分からないと(笑)

    公開予定は無いのでメールで教えますね。あ、でもやっと最近じゃ

    事態が落ち着いてきたんで、CGIリネーム おまけを書く予定だすぅ。

  21. Kazu より:

    どーもですぅ( `ー´)ノ

    なるほどぉ、さすがですねん。

    確かにコメントCGI見ると、「ふむふむ」ですね。

    で、やりかたおせーて(笑)。

  22. たねちゃん より:

    おーこらKazuさん(笑)


    せっかくCGIリネーム完全熟成版を公開したからトラバしたのに

    Six Apartと同じエラーが出るんですけどぉ…( つД`)

  23. Kazu より:

    失礼いたぢましたっ!

    最近トラックバックスパムが相当なことになってまして、

    MTのスロットル設定(OneDayMaxPings)のデフォルトの50を超えてしまっているためのようです。

    実際、ログを見ると過去24時間以内にきっちり50件のスパムを受信して迷惑トラックバックに逝ってました。

    設定値を変更しておきますので再度トライをお願いいたしますだ。

    (しっかし、これほどCGIリネームをすり抜けるものがあるとは、、)

    参考:Movable Type の HTTP error: 403 Throttled に関するまとめ

Leave a Reply

Kazuizm は WP Super Cache でキャッシングされているおかげで Digg に耐えられます