金曜日, 11 3 月 2005

JCaptchaで不正登録防止
この記事をクリップ!
このエントリーをはてなブックマークに追加

« リルとおもちゃ | Main | Drive-Thruのお買い得コンピ »
CaptchaとはCompletely Automated Public Test to tell Computers and Humans Apartの頭文字を取った造語で日本語で説明するとユーザーが人間かコンピュータか区別する自動化されたテストの事、となる。
具体的な例をあげるとYahooなどの会員登録の際に読みづらい文字が描かれた画像中の文字を判別させて入力させるフォームなどがそうだ。
言うまでもなくこれはプログラムなどによる不正な会員登録を防止するための措置でYahooに限らず最近は他のサイトでも見かけるようになってきた。
この読みづらい文字が描かれた画像を生成するJavaの実装がJCaptchaだ。
使用方法はcom.octo.captcha.engine以下のパッケージに用意されているImageCaptchaEngineの実装クラスからImageCaptchaオブジェクトを取得し文字の書かれた画像を生成する。
以下のサンプルはDeformedBaffleListGimpyEngineを使用し画像生成を行う。
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStreamReader;
import java.io.BufferedReader;

import javax.imageio.ImageIO;

import com.octo.captcha.engine.image.gimpy.DeformedBaffleListGimpyEngine;
import com.octo.captcha.engine.image.ImageCaptchaEngine;
import com.octo.captcha.image.ImageCaptcha;


public class test
{
  public static void main(String[] args)
  throws Exception
  {
    File file=new File("challenge.jpg");

    ImageCaptchaEngine engin=new DeformedBaffleListGimpyEngine();
    ImageCaptcha captcha=engin.getNextImageCaptcha();

    BufferedImage image=captcha.getImageChallenge();
    ImageIO.write(image,"JPEG",file);
    System.out.println(captcha.getQuestion());

    BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));

    String ans=reader.readLine();
    if(captcha.validateResponse(ans).booleanValue())
      System.out.println("OK");
    else
      System.out.println("NG");
  }
}
上記サンプルを実行するとカレントディレクトリにchallenge.jpgという名前で文字の描かれた画像が生成された後、標準入力から入力待ちになるので読みとった文字を入力して正解ならばOK間違いならばNGと表示される。
生成される画像は以下のような感じ。

上の場合だと「coldly」で正解となる。
ただDeformedBaffleListGimpyEngineを使うと人間が見ても読めないかもしれない文字が作られる場合もあるのであまりおすすめ出来ない。
描かれる文字や背景のカスタマイズはImageCaptchaEngineを使わずダイレクトにcom.octo.captcha.image.gimpyパッケージのGimpyFactoryなどを使えば自由に変更することが可能だ。
Posted by tsujitako at 2:08 午後 in Java/