ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

MacBook で CAPTCHA を試してみる(編集中)

MacBookCAPTCHA を使ってみる。言語は Perl

GD 導入

↓を見れば GD 導入まで楽々でしたw
http://wiki.livedoor.jp/kojima_ichiro/d/How%20to%20install%20GD%20on%20Mac%20OS%20X%2010.4

作業場所
$ mkdir ~/work
$ cd ~/work
zlib の導入
$ curl -O http://www.zlib.net/zlib-1.2.3.tar.gz
$ tar zxvf zlib-1.2.3.tar.gz
$ cd zlib-1.2.3;
$ ./configure --shared && make && sudo make install
Password:
$ cd ..
libjpeg の導入
$ curl -O http://www.ijg.org/files/jpegsrc.v6b.tar.gz
$ tar xzvf jpegsrc.v6b.tar.gz
$ pushd jpeg-6b/
$ ln -s `which glibtool` ./libtool
$ ./configure --enable-shared && make && sudo make install
Password:
$ popd
libpng の導入
$ curl -O ftp://ftp.simplesystems.org/pub/libpng/png/src/lpng1225.zip
$ unzip lpng1215.zip
$ pushd lpng1215/
$ cp scripts/makefile.darwin makefile
$ make ZLIBINC="/usr/lib" ZLIBLIB="/usr/lib" && sudo make install
Password:
$ sudo ranlib /usr/local/lib/libpng.a
$ popd
freetype2 の導入
$ curl -O http://download.savannah.gnu.org/releases/freetype/freetype-2.1.10.tar.gz
$ tar xzvf freetype-2.1.10.tar.gz
$ pushd freetype-2.1.10
$ ./configure && make && sudo make install
Password:
$ popd
GD の導入
$ curl -O http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
$ tar xzvf gd-2.0.33.tar.gz
$ pushd gd-2.0.33
$ ln -s `which glibtool` ./libtool
$ ./configure \
 CPPFLAGS=-I/usr/X11R6/include/freetype2 \
 --prefix=/usr/local \
 --mandir=/usr/local/man \
 --bindir=/usr/local/bin \
 --with-freetype=/usr/X11R6 \
 --includedir=/usr/local/include
$ make && sudo make install
Password:
$ popd

CPAN モジュールの導入

  • 利用モジュール
    • GD
    • HTML::Template
    • Authen::Captcha
  • コマンド
$ sudo -H cpan -i GD
$ sudo -H cpan -i Authen::Captcha


これであとは Authen::Captcha を使って CGI を作り込めばよい。

概要

  • captcha.cgi
    • 実装する機能
      • 機能1:認証キャプチャを表示
      • 機能2:認証の正否を判断
    • ファイルパス
      • /Library/WebServer/CGI-Executables/captcha.cgi
    • URL
    • 内部で利用する MD5 値を出力するディレクトリ
      • /Library/WebServer/CGI-Executables/md5
    • CAPTCHA 画像ファイルの出力先ディレクトリ
      • /Library/WebServer/Documents/md5

ソースコード

#!/opt/local/bin/perl -w
use strict;
use CGI;
use Authen::Captcha;

# _init_
my $q = new CGI;
my $captcha = Authen::Captcha->new(
       data_folder   => '/Library/WebServer/Documents/md5', #MD5キー出力先
       output_folder => '/Library/WebServer/Documents/md5', #生成画像の相対パス
   );


eval {
    my $code = $q->param("mycode") || undef;
    my $cmd  = $q->param("mycmd")  || undef;
    my $md5  = $q->param("mymd5")  || undef;

    if( $code && $cmd && $md5 && $cmd eq 'check'){
        &do_check($code, $md5);
    } else {
        &do_create();
    }


};
if($@){
    print <<HTML;
Content-type: text/plain

Exception: $@
HTML
}


sub do_create {
    my $md5 = $captcha->generate_code(5); #5桁の画像を作成
    my $created_captcha_name = "/md5/${md5}.png";

    print <<HTML;
Content-type: text/html

<html>
<head><title>captcha test</title></head>
<body>
    <h1>hello world</h1>
    <p><img src="$created_captcha_name" /></p>
    <form action="captcha.cgi" method="POST">
        <input type="hidden" name="mycmd" value="check" />
        <input type="hidden" name="mymd5" value="$md5" />
        <input type="text" name="mycode" />
        <input type="submit" value="Submit" />
    </form>
</body>
</html>
HTML
}

sub do_check {
    my($code,$md5) = @_;
    my %result2message ={
         1 => "ok",   #"認証成功",
         0 => "error",#"ファイルエラーのためコードのチェックが出来ませんでした。",
        -1 => "NG",   #"コードが違います(期限切れ)",
        -2 => "NG",   #"コードが違います(存在しません)",
        -3 => "NG",   #"コードが違います(コード不一致)",
    };
    my $result = $captcha->check_code($code,$md5);
    my $message = $result2message{$result};

    print <<HTML;
Content-type: text/html

<html>
<head><title>result</title></head>
<body>
    <h1>result:$result</h1>
    <p>message:$message</p>
    <p>code:$code</p>
</body>
</html>
HTML
}

実行結果

ソースができたら。



発生したエラー、対応内容

あっさり終わるかと思いきや、Perl の再インストール周りで何かが悪さしているらしい。何が原因なのかを調査ー

[Fri Jan 18 00:03:48 2008] [error] (2)No such file or directory: exec of /Library/WebServer/CGI-Executables/hello.cgi failed
[Fri Jan 18 00:03:48 2008] [error] [client 127.0.0.1] Premature end of script headers: /Library/WebServer/CGI-Executables/hello.cgi

とおもったら、Perl のパスが違ってました。

$ which perl
/opt/local/bin/perl

ちゃんと確認しないとだめだぁね。