カタカナでCAPTCHAをつくるPHPコード

CAPTCHAに関する記事。

CAPTCHA破りもかなりできるらしい。
アルゴリズム的には堅牢になっていませんが、生成する画像にアルファベットではなくて片仮名を使ったらどうだろう、と思ってphpspotでお勧めされていたKCAPTCHAのコードを拝見しつつつくってみました。

デモは以下。LGPLでPHPのコードごと見れます。

Japanese KATAKANA CAPTCHA test
I published source code only:

katakana_captcha_img.png

参考にしたKCAPTCHAのコードはphpclasses.orgでユーザ登録しないとダウンロードできません。思ったより短いコードで、コアはたったの200行。

  • アルファベットをPNGから切り出している
  • o=0, 1=lなど似た文字はあらかじめ排除している
  • rnとrmのように隣り合うと識別しにくくなる文字列を排除している
  • 文字を歪めるアルゴリズムはsinカーブを描くようにごりごりimagesetpixelでやっている模様

カタカナにするにあたって、特にアルファベットと変わる点はなく同じようにツとシのように識別しづらいものは排除しました。ただ、隣り合うと識別しづらくなる文字の組み合わせがあまり思い付かなかったのでそちらは実装していません。ノとレとか?あとユーザ入力と生成された文字列の比較時に小さいャとヤの区別を付けない方がいいかもしれません。

また、昔から好きなGrayGraphicsのフリーフォントを使わせていただきました。CAPTCHAに使っていいかライセンス的によくわからないので商用利用の際は注意が必要かもしれません。

今回は1つのフォントしか使っていませんが、破られないように強化するならKCAPTCHAのように複数のフォントをランダムに使った方がベターでしょう。文字数も固定長にしない方がいい。ただそれもCAPTCHA破りの汎用性によっては無意味なのかもしれません。現在ある最強のCAPTCHA破りアルゴリズムだとカタカナに対応するためのデータを学習すれば簡単に破れるんでしょうか。

なおPNGではなくTTFを使ったので動作環境にはGDとfreetypeが必要になります。一応PHP5用。ちょっと変えればPHP4でも動くはずです。

This entry was posted in つくる. Bookmark the permalink. Both comments and trackbacks are currently closed.

3 Comments

  1. Posted 2006/11/27 at 1:09 am | Permalink

    https://member.gungho.jp/front/register/entry.aspx
    ひらがなの画像認証なんかもたまたま見かけました。PHP ではないですが…。

  2. Posted 2006/11/27 at 8:59 am | Permalink

    情報ありがとうございます。
    オープンソースになっていないだけで、カタカナも実装例はありそうですね。
    子供向けだと確かにアルファベットは難しい。GungHoの場合、10歳では他の文章中の漢字の方が難しいかもしれませんが。

  3. 八環
    Posted 2007/02/19 at 12:55 am | Permalink

    これはなかなかよさそうですね。
    しかし、テストページでは「ア」と「マ」の判別が難しかったです。
    また、少しはみ出して見えない文字もありました。

One Trackback

  • By Do You PHP はてな on 2006/11/27 at 4:23 pm

    [PHP]カタカナCAPTCHA…

    おおーっ!カタカナ知ってる人限定ですが、これ良いですね。 CAPTCHA破りもかなりできるらしい。 アルゴリズム的には堅牢になっていませんが、生成する画像にアルファベットではなく…

Page optimized by WP Minify WordPress Plugin