日本語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 を書き換える事で、認証に使う文字を変えられる。小難しい漢字や似た漢字(「博」と「愽」とか)を入れれば更に効果的かも知れない(笑)



  • blog/2013/2013-05-05.txt
  • 最終更新: 2015-01-06 11:51
  • (外部編集)