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のレンタルサーバや、自宅サーバ(LINUX系)なら可能)

準備

念のためいつでも元に戻せるようにしておくと安心して先に進める。

  • エントリアーカイブテンプレートのバックアップ  テンプレートを開いて、中身を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 スパム業者も日々進化しているのだろうけど、とりあえずこれでしばらくはMovableTypeがそもそも不要なスパムフィルタリング処理に翻弄されなくて済む日々が続くことを願う。。



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