drupalのimage CAPTCHAで文字化け

スパム対策で多用されるCAPTCHA(画像文字認証)ですが、
最近は英字だと効果が薄くて、すぐにスパムが入ってしまいます。

そこで2バイト文字を使うのですが、漢字だと中国人が読めてしまって意味が無いので、
私は、日本人しか読めないひらがなを使って、フィルタリングしています。

今のところ、ひらがなを使って日本語のセールスは投稿されたことがあっても、
ロボット(もしくは人海戦術)に破られたことはありません。

その、CAPTCHAをdrupalのimage CAPTCHAモジュールで使用しているのですが、
今まで、設定の使用文字のところにひらがなを書けば良かったのに、
今回はそれでは文字化けを起こしてしまいどうしようもなくなってしまいました。
なんとか対処法を見つけたので、今回はそのお話。

image CAPTCHAモジュールは、
image_captcha.user.incファイルの_image_captcha_image_generator_print_string関数の下の方320行目あたりで、

imagestringやimagettftext関数を使って文字を画像化しています。

というわけで当然のごとく、これがアヤシイので検索すると。これをネタにした記事がありました。

http://serika.blog.abk.nu/0839

というわけで、サーバー環境依存だったのですね。
ですので、

$character = mb_convert_encoding($character, ‘SJIS’);
// draw character
if ($font == ‘BUILTIN’) {
imagestring($image, 5, $pos_x, $pos_y, $character, $color);

と言う風に修正してやれば。無事、ひらがなが表示出来るようになりました。
認証も通ります。よしよし。

え、文字ごとじゃ無くて、文字列の段階でやれば?って?

そうしたいのは、やまやま何ですが、文字の表示長さを求める関数がありまして、

$characters = _image_captcha_utf8_split($text);

これ、UTF-8で渡さないとならないのですよ、そして帰ってくるcharactersは、
文字列じゃなくて、分割された文字の配列(よく読んでないけど文字列として扱えない)

というわけで、サーバーリソースがきになる人はもう一手間した方が良いのですが、
私はあまり気にならないので、こんな感じで。

カテゴリー: Web パーマリンク

コメントを残す

メールアドレスが公開されることはありません。