G-chan Square

じーちゃん/へたっぴの綴る、日々のつれづれとか。
twitterのまとめとゲームネタが中心。2015年からロードバイク/ミニベロ始めました。

[movable type6] SpamLookup微修正

こんばんわ、最近はロードバイクに少しずつハマりつつあるじーちゃんです。

さて、ロードバイクとは一切関係ないんですが、じーちゃんのこのG-chan SquareにたまーにSPAM投稿が届くようになったので、MovableType6のスパム防止機能'SpamLookup'を微修正しました。
元々、MovableType6にはスパム対策として'SpamLookup'という機能がついており、デフォルトで有効になっているのですが・・・どうもうまく動いていない様子。

で、スパム対策もいろいろ調べたんですが、どうもMT6に対応したプラグインがほとんどないっぽい。

NotJapaneseLookupとかいいなぁ、と思ったので入れてはみたものの動いている気配なし。
プラグイン一覧に表示されて設定なんかは変更できるものの、実際にコメント投稿しても有効になっている気配がない。
ソースをわざとコンパイル失敗するように書き換えても普通にコメント投稿できてしまうので、どうやらプラグインとして実行されるところまで行ってない → ログにコンパイルエラーが出ていることが発覚。evalされて握りつぶされた様子ですな。

ま、しょうがないのでデフォルトのSpamLookupを利用しましょう。


で、ちょくちょく投稿されるスパムコメントは英語圏からの仕業のようで、投稿内容がアルファベットのみで構成されていました。
まぁじーちゃんのこのサイトにコメントする場合、日本語書かないってことはまぁまずあり得ないのでアルファベットのみで構成されたコメント文は禁止にしましょう。

・・・ということで、SpamLookup Keyword Filterにこんな設定をしてみました。
# Your Junk keyword list can contain words, phrases, patterns,
# and domain names. Each item must be on a separate line.
#
# Words and phrases can be listed plainly. They are tested in a
# case-insensitive manner and match against "whole" words:
# Patterns are Perl regular expressions.
/^[\x0A\x20-\x7A]+$/
# You can optionally place a score at the end of the line to adjust
# the penalty applied for matching that item.
phentermine 4
アルファベットだけで構成されていたら、/^[\x0A\x20-\x7A]+$/ の正規表現に引っかかるはずだから、これで防げるでしょう。

と思ってたんですが・・・なぜか効かない


で、あれこれ調べました。
フィルタリング処理は plugins/spamlookup/lib/spamlookup.pm の wordlist_match という関数にて行われています。引数の$textにコメント内容、$patternsが設定してあるフィルタリング正規表現なんかが渡ってきます。

で、ここで、当初$textにはコメントの内容だけが渡されてくるとばかり思っていたんですが、そうではない、ということが発覚。
正しくは以下のような文字列が渡ってきます。
name:じーちゃん
email:
url:
text:onlinecasino
全部盛りだったのかっ!w

投稿されてきたスパムのnameのところは、ここだけ律儀に「匿名」とかになっていたはず。なので、全部が全部半角だけで構成されていたと見なされていなかった、というオチの様子。

なので、nameを除く部分が半角だけで構成されていた場合はスパム行き、とするように回収しました。
$ diff -u  spamlookup.pm.20150518   spamlookup.pm
--- spamlookup.pm.20150518      2015-05-18 00:22:13.278795105 +0900
+++ spamlookup.pm       2015-05-18 00:08:10.543795850 +0900
@@ -571,8 +571,10 @@
 sub wordlist_match {
     my ( $text, $patterns ) = @_;
-
+
     $text ||= '';
+#debug_log($text);
+    $text =~ s/name:\S+//;
     my @patt = split /[\r\n]+/, $patterns;
     my @matches;
     foreach my $patt (@patt) {
@@ -613,6 +615,14 @@
     @matches;
 }
+sub debug_log {
+  my $text = shift;
+  my $OUT;
+  open($OUT, '>>/tmp/mt_debug.log') || die $!;
+  print $OUT $text."\n";
+  close $OUT;
+}
+
 sub domain_or_ip_in_whitelist {
     my ( $domain, $ip, $whitelist ) = @_;
debug_logとかあるけれどそれは無視していただいて、とりあえず $text =~ s/name:\S+//; の処理を入れてnameの部分を除去ってから正規表現にかけるように変更しました。

まぁ、仮対応ですが、ちょっとこれで様子見てみましょう、ってことで。

コメントする