カタカナで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でも動くはずです。

  1. #1 by 奥村隆一 on November 27th, 2006 - 1:09 am

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

  2. #2 by funaki on November 27th, 2006 - 8:59 am

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

  3. #3 by 八環 on February 19th, 2007 - 12:55 am

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

(will not be published)
Subscribe to comments feed

SetPageWidth