start

DokuWikiにStopForumSpam 2を入れたらスパムがピタッと止んだ

ここ一か月ほど、blog記事へのピンバックスパム攻撃に晒されていた。気づいたときにシコシコと手動削除で対応してたけど、Google Analyticsの報告でスパムが原因と思われる読み込み時間が異様に長いページが出始めたため、本腰を入れて対応することにした。

DokuWikiにも有名処のスパム対策としてCAPTCHAプラグインreCAPTCHAプラグインが用意されている。うちでもコメント投稿用にCAPTCHAは導入済みでスパムコメントは全くないが、仕組み的にBlogTNGのピンバックには効果がない。スパマーの大半はロシア中国韓国の「あっ(察し」なところ経由で来てて、それら全部のアクセスを遮断しちゃってもいいんだけど、さすがに乱暴すぎる。

スパマーのIPアドレスを動的に良い感じで遮断してくれるプラグインは無いかと探してたら、StopForumSpam Plugin 2ってのがあった。

このプラグインはStop Forum Spamの情報を利用してスパムを遮断するものだが、設定によりスパマーのアクセス自体の遮断も行えるのがポイント。サイト設定の以下の項目を0以外にすると、Stop Forum Spamのスコアに基づいてアクセスを遮断してくれるようになる。プラグインの作者は日本人のようで、説明が日本語なのも嬉しい。

  • plugin»stopforumspam2»accessRefusalFreq
  • plugin»stopforumspam2»accessRefusalConf

この設定をしてから、1日50件くらいあったピンバックスパムが、4日経過時点で1件のみと素晴らしい成果を上げている。Stop Forum Spamとプラグインの作者さんに超感謝なのだ。

BlogTNGに迷惑トラックバック除けを仕込む

昨日CAPTCHAの日本語化改造を行ったものの、未だにスパムが来る。平仮名も解析する高性能botなのか?と少し絶望しつつ、改めてスパム履歴を見ていたところ大半がトラックバックだった。captchaの意味なし。/(^o^)\ナンテコッタイ。

そもそもBlogTNGにトラックバックを受け取る機能付いてんの?って話だが(エントリーのどこにもトラックバックアドレスが書かれてないし)、生成されたHTMLを見てみると、RSSの中にtrackback:pingとして埋め込まれていた。なるほどなー、糞スパマーどもはRSSで爆撃対象を効率的に集めながらスパム行為をしてるわけか。少し感心したが、スパマーは氏ね。

当該部分の生成はblogtng/action/linkback.phpで行われているので、てきとーにスパム除け仕様にしといた。

今度こそ・・・今度こそ収まるはずだ・・・!

日本語captcha作ったった

「ギャラクシーS3のカスタムケースあるよ」(英語)というスパムコメントが死ぬほどウザい。一晩で500件も投稿すんな!クソチョンのガラクターなんて持ってねーし、買う気もねーよksg。iPhone関連のスパムはなく、なんでガラクターだけなんだよ。ステマしてんじゃねーよトンスル民族!!

もうマジでげきオコスティックファイナリアリティぷんぷんドリーム状態なので、怒りのままにcaptchaプラグインのひらがな対応化改造を行った。外国人涙目だろうが、こんなクソみたいなサイトを見てる奇特な人は居ないだろうから気にしない。これでbotを誤魔化せるといいんだが…。

折角なのでパッチを公開しておく。

  • CAPTCHA plugin 2013/04/29 15:50版以降
  • Unicode対応の日本語True Typeフォント(ライセンス的に画像化してもいいもの)
  • ↓のパッチ
captcha_ja.patch
--- a/helper.php	2013-04-29 06:50:38.000000000 +0900
+++ b/helper.php	2013-05-05 19:55:44.000000000 +0900
@@ -88,7 +88,7 @@
                 }
                 break;
         }
-        $out .= ' <input type="text" size="5" maxlength="5" name="'.$this->field_in.'" class="edit" /> ';
+        $out .= ' <input type="text" size="10" maxlength="10" name="'.$this->field_in.'" class="edit" /> ';
 
         // add honeypot field
         $out .= '<label class="no">Please keep this field empty: <input type="text" name="'.$this->field_hp.'" /></label>';
@@ -150,11 +150,18 @@
         $numbers = md5($rand * $fixed); // combine both values
 
         // now create the letters
+/*
         $code = '';
         for($i=0;$i<10;$i+=2){
             $code .= chr(floor(hexdec($numbers[$i].$numbers[$i+1])/10) + 65);
         }
-
+*/
+        $strTable = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゐゆゑよらりるれろわをん';
+        $strLength = mb_strlen($strTable);
+        $code = '';
+        for ($i=0;$i<10;$i+=2){
+            $code .= mb_substr($strTable, hexdec($numbers[$i].$numbers[$i+1])%$strLength, 1);
+        }
         return $code;
     }
 
@@ -203,7 +210,7 @@
         }
 
         // draw the letters
-        for ($i = 0; $i < strlen($text); $i++){
+        for ($i = 0; $i < mb_strlen($text); $i++){
             $font  = $fonts[array_rand($fonts)];
             $color = imagecolorallocate($img, rand(0, 100), rand(0, 100), rand(0, 100));
             $size  = rand(floor($h/1.8),floor($h*0.7));
@@ -213,7 +220,7 @@
             $cheight = $size + ($size*0.5);
             $y = floor($h / 2 + $cheight / 3.8);
 
-            imagettftext($img, $size, $angle, $x, $y, $color, $font, $text[$i]);
+            imagettftext($img, $size, $angle, $x, $y, $color, $font, mb_substr($text, $i, 1));
         }
 
         header("Content-type: image/png");
  1. CAPTCHAプラグインをインストール
  2. CAPTCHAの種類を「Image」にする
  3. lib/plugins/captcha/fonts に最初から入っているフォントを使えない状態にする(拡張子を .ttf_ にするなど)
    • ↑にある.ttfをランダムに選んで認証画像を作るので、非日本語フォントがあると正しく画像が生成されない。
  4. lib/plugins/captcha/fonts に日本語フォントを置く
    • ライセンスに注意。IPAフォント(IPAフォントライセンスv1.0準拠)あたりなら問題ないと思われる。
  5. 拙作パッチを当てる
  • 「Image」以外では動作しません。
  • 文字コードはUTF-8しか想定してないので、ブラウザによっては認証が通らない事があるかも?
  • $strTable を書き換える事で、認証に使う文字を変えられる。小難しい漢字や似た漢字(「博」と「愽」とか)を入れれば更に効果的かも知れない(笑)
  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo