Authen::Quiz

目次

入力フォームの人手による入力をクイズを出題して確認。

NAME

Authen::Quiz - The person's input is confirmed by setting the quiz.

SYNOPSIS

  use Authen::Quiz;
  
  my $q= Authen::Quiz->new(
    data_folder => '/path/to/authen_quiz',  ## データファイルを配置するパス
    expire      => 30,                      ## 出題の有効期限(分)
    );
  
  ## クイズの出題
  my $question= $q->question;
  
  ## question メソッドを呼び出すと session_id がセットされる。
  ## この値をフォームに埋め込み、後で check_answer メソッドに渡す。
  my $session_id= $q->session_id;
  
  #
  ## 入力された答えのチェック
  my $session_id = $cgi->param('quiz_session') || return valid_error( ..... );
  my $answer     = $cgi->param('quiz_answer')  || return valid_error( ..... );
  if ($q->check_answer($session_id, $answer)) {
    # ... is success.
  } else {
  	return valid_error( ..... );
  }

DESCRIPTION

このモジュールはフォームの入力に対してクイズを出題し、それが人為的に行なわれているかを確認します。

近頃はキャプチャ認証が画像解析技術の向上によって破られる事があるそうなので、それに代わるものとして製作しました。

また、クイズの難易度を調節すれば入力フォームを利用できるユーザーを限定したりする事もできると思います。

人為的入力のチェック方法

1. 問題の出題

question メソッドで受け取った問題を画面に表示。

session_id メソッドで受け取ったIDを入力フォームの hidden フィールドにセット。

2. 入力された答えの確認

check_answer メソッドに 1. の session_id と入力された答えを渡して、一致するかを確認します。

YAML形式のクイズデータの準備

使用にはまず、次の様なYAMLフォーマットのクイズデータを作成しておく必要があります。

  ---
  F01:
    - What color is the color of the apple ?
    - red
  F02:
    - What color is the color of the lemon ?
    - yellow
  F03:
    - The color of the orange and the cherry ties by '+' and is answered.
    - orange+red

'F01' などはクイズデータの識別名です。名称に規則は無くユニークな名称なら何でも構いません。 そして、識別名配下の値は ARRAY で、第1要素が「問題」、第2要素が「答え」になるようにします。

完成したら 'data_folder' 配下に 'authen_quiz.yaml' という名前のファイルを作成します。

セッションデータの準備

'authen_quiz_session.txt' という名前の空ファイルを作り、CGIスクリプトから書き込める権限を設定しておきます。

これで準備は完了です。

後は、これに合わせてWEB入力フォームと入力確認の部分を製作して下さい。

METHODS

new ([OPTION_HASH])

コンストラクタ。

オプションとして次の様な項目を含む HASH を渡します。

  my $q= Authen::Quiz->new(
    data_folder => '/path/to/temp',
    expire      => 60,
    );

quiz_yaml

クイズデータのパスを返します。

※返すのは 'data_folder' に $QuizYaml? を繋げた値です。

$QuizYaml? の値を変更するとクイズデータのファイル名を変更できます。

  $Authen::Quiz::QuizYaml    = 'orign_quiz.yaml';

session_file

セッションデータのパスを返します。

※返すのは 'data_folder' に $QuizSession? を繋げた値です。

$QuizSession? の値を変更するとセッションデータのファイル名を変更できます。

  $Authen::Quiz::QuizSession = 'orign_quiz_session.txt';

load_quiz

YAML形式のクイズデータをロードします。

  my $quiz_data= $q->load_quiz;

question

入力フォームに表示する質問を出題します。

このメソッドは同時に session_id にユニークなHEX値をセットします。

  my $question= $q->question;

session_id

このメソッドで受け取った値を入力フォームの hidden フィールドにセットして引き継げるようにします。

この値は check_answer メソッドを呼び出す時に必要になります。

  my $question   = $q->question;
  my $session_id = $q->session_id;

check_answer ([SESSION_ID], [ANSWER_STRING])

フォームに入力された答えが正しいかチェックします。

SESSION_ID には session_id メソッドで受け取った値を渡します。

ANSWER_STRING には 入力されたデータをそのまま渡します。

※Validation は行なわないので要注意です。

  my $session_id = validate($cgi->param('quiz_session')) || return valid_error( ..... );
  my $answer     = validate($cgi->param('quiz_answer'))  || return valid_error( ..... );
  if ($q->check_answer($session_id, $answer)) {
  	# success.
  } else {
  	return valid_error( ..... );
  }

remove_session ([SESSION_ID])

クイズ・セッションのデータを削除します。

SESSION_ID を省略すると全てのデータが消されます。

  $q->session_remove( $session_id );

OTHERS

クイズデータは毎回読み込んでいるのでレスポンスに問題があるかもしれません。 これは Wrapperモジュール を作成してキャッシュを使うようにすれば解決できます。

  package MyAPP::AuthQuizWrapper;
  use Cache::Memcached;
  use base qw/ Authen::Quiz /;
  
  sub load_quiz {
     my $cache= Cache::Memcached->new;
     $cache->get('authen_quiz_data') || do {
         my $data= $_[0]->SUPER::load_quiz;
         $cache->set('authen_quiz_data'=> $data, 600);
         data;
       };
  }
  
  1;

若しくは Authen::Quiz::Plugin::Memcached を使って下さい。

SEE ALSO

Authen::Quiz::FW, Class::Accessor::First?, Digest::SHA1, File::Spec, YAML::Syck?,

AUTHOR

Masatoshi Mizuno E<lt>lusheE<64>cpan.orgE<gt>

COPYRIGHT AND LICENSE

Copyright (C) 2008 by Bee Flag, Corp. E<lt>http://egg.bomcity.com/E<gt>.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.