====== 日本語captcha作ったった ====== 「ギャラクシーS3のカスタムケースあるよ」(英語)というスパムコメントが死ぬほどウザい。一晩で500件も投稿すんな!クソチョンのガラクターなんて持ってねーし、買う気もねーよksg。iPhone関連のスパムはなく、なんでガラクターだけなんだよ。ステマしてんじゃねーよトンスル民族!! もうマジで**げきオコスティックファイナリアリティぷんぷんドリーム**状態なので、怒りのままにcaptchaプラグインのひらがな対応化改造を行った。外国人涙目だろうが、こんなクソみたいなサイトを見てる奇特な人は居ないだろうから気にしない。これでbotを誤魔化せるといいんだが…。 折角なのでパッチを公開しておく。 ===== 必要なもの ===== * [[https://www.dokuwiki.org/plugin:captcha|CAPTCHA plugin]] 2013/04/29 15:50版以降 * Unicode対応の日本語True Typeフォント(ライセンス的に画像化してもいいもの) * ↓のパッチ --- 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 .= ' '; + $out .= ' '; // add honeypot field $out .= ''; @@ -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"); ===== 使い方 ===== - CAPTCHAプラグインをインストール - CAPTCHAの種類を「Image」にする - lib/plugins/captcha/fonts に最初から入っているフォントを使えない状態にする(拡張子を .ttf_ にするなど) * ↑にある.ttfをランダムに選んで認証画像を作るので、非日本語フォントがあると正しく画像が生成されない。 - lib/plugins/captcha/fonts に日本語フォントを置く * ライセンスに注意。[[http://ossipedia.ipa.go.jp/ipafont/ipaexfont/download.html|IPAフォント]](IPAフォントライセンスv1.0準拠)あたりなら問題ないと思われる。 - 拙作パッチを当てる ===== その他 ===== * 「Image」以外では動作しません。 * 文字コードはUTF-8しか想定してないので、ブラウザによっては認証が通らない事があるかも? * $strTable を書き換える事で、認証に使う文字を変えられる。小難しい漢字や似た漢字(「博」と「愽」とか)を入れれば更に効果的かも知れない(笑)