« 気にしないつもりが | メイン | みてきました »
コメントスパム対策とりあえずバージョンのソース
2005年04月14日

私のへぼへぼなコメントスパム対策も少しは役に立つことがあるようです。
最近になって、また何度かひっかかっているヤツがいることに気付きました。
コメントスパムのログ

以前に『コメントスパムを防御できた』というエントリーに対して「ソースを教えてください」とリクエストをいただいていたのに、なかなか実現できなくてすみませんでした。
やっとやっと....(いいのかどうかわかりませんが)、例として紹介させていただくことにしました。
断っておきますけれど...(笑)
決してベストな方法ではないと思います。
なにかの参考にでもなれば幸いです。

チェックの流れはコメントスパム対策とりあえずバージョン実装を参照してくださいね♪

◆チェックするための準備作業◆
(1)comments_check.plを作成する。
comments_check.plの内容
・REMOTE_ADDR情報を含み、かつユニークな値を持つ(例では時刻)文字列を生成する。
・生成した文字列を標準出力へ出力する(query_stringとしてセットされる)。
・生成した文字列をチェック用ファイル(check_file)へ出力する。

comments_check.pl
ソース例


#!/usr/bin/perl
  $check_file = "/hogehoge/check_file";
  open(LOG,">>$check_file");
  $date = `date +"%H%M%S_%d%m%y"`;
  chop ($date);
  $addr =  $ENV{'REMOTE_ADDR'};
  $host = gethostbyaddr(pack("C4",split(/\./,$addr)),2);
  print "damedamespam\_$date\_$host\_$addr";
  print LOG  "damedamespam\_$date\_$host\_$addr\n";
  close(LOG);

※comments_check.plはSSIとして動きます。
※当プログラムがどこのディレクトリから起動されるか不定ですので、check_fileは固定パス(ルートからのフルパス)です。
※check_fileはどこに置いてもかまいませんが、SSIから読み書きできる権限が必要です。

(2)配置
comments_check.plをSSIとして呼び出し可能な場所に配置します。
例 /home/hoge/public_html/ssi/comments_check.pl

(3)権限の設定
例 $ chmod 755 /home/hoge/public_html/ssi/comments_check.pl

(4)lib/MT/Template/Context.pmの変更
MovableTypeのコメント呼び出し部分のテンプレートが
lib/MT/Template/Context.pm
にありますので、comments_check.pl呼び出し処理を埋め込みます。

(1160行目付近と1220行目付近の2箇所...MTのバージョンによって異なりますので、formタグを目標に探してください。)
<form method="post" action="$path$comment_script?<!--\#exec cmd=\"/home/hoge/public_html/ssi/comments_check.pl\"-->" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)">

(5)MTの管理画面から、テンプレート「Individual Entry Archive」の変更
formタグを見つけてください。
<$MTCommentScript$>の後ろに、comments_check.pl呼び出し処理を埋め込みます。

<form method="post" action="<$MTCGIPath$><$MTCommentScript$>?<!--#exec cmd="/home/hoge/public_html/ssi/comments_check.pl"-->" name="comments_form" onsubmit="if (this.bakecookie[0].checked) rememberMe(this)">

◆コメントが投稿された時のチェック◆
(1)mt-comments.cgiの修正

チェック用の関数(check_query_string)を追加と呼び出し

check_query_stringの内容
・ポストされた内容より取得したquery_stringを、上記(1)のプログラムで出力したcheck_fileと比較します。
・check_fileにquery_stringと等しいものが存在しない場合→→コメントスパムと判断します。
・check_fileにquery_stringと等しいものが存在した場合
 →→IPアドレス(REMOTE_ADDR)をチェックします。
  ・query_string中の、コメント表示時のIPアドレスと、実際にPOSTされたREMOTE_ADDRが等しい場合
   →正しいコメントと判断します。
  ・コメント表示時と、実際にPOSTされたREMOTE_ADDRが等しくない場合
   →コメントスパムと判断します。

mt-comments.cgi

呼び出しは、最初に実行されるように。
関数自体は最後のほうに追加するとよいと思います。

##最初のほうに... ## QUERY_STRINGのチェック呼び出し   &check_query_string;

##最後のほうに...
## QUERY_STRINGのチェック関数
sub check_query_string{
  open (CHECK_F,"/hogehoge/check_file");
  my @LINES=<CHECK_F>;
  my $query_string = $ENV{'QUERY_STRING'};
  close(CHECK_F);
  foreach my $line (@LINES) {
    if( $line =~ $query_string ){
      if ( $query_string =~ $ENV{'REMOTE_ADDR'} ) {
        return;   ## OK
      } else {
        my $date = `date +" %H:%M:%S %d/%b/%Y"`;
        chop ($date);
        `echo "---- spammer info($date) ----"
                  >> /home/hoge/public_html/spammer.txt`;
        `echo "query_string:$query_string" 
                  >> /home/hogehoge/public_html/spammer.txt`;
        `echo "posted address:$ENV{'REMOTE_ADDR'}" 
                  >> /home/hoge/public_html/spammer.txt`;
        last;   ## NG
      }
    }
  print "Content-Type: text/html\n\n";
  print "You must comment in the right way.";
  exit;
}


投稿者 megu : 2005年04月14日 12:19

コメント

コメントしてください




保存しますか?