現在執筆中です。

Yomi-SearchにCaptchaを付ける

ここではYomi-Search(ヨミサーチ)にCaptchaを付ける方法を紹介します。Captchaとは、読みにくい文字を表示した画像を投稿者に解読させることにより、人間が投稿することを確かめる方法です。詳しくは、Wikipediaの解説をご覧ください。

Authen::Captchaのインストール

ここでは、Authen::Captchaを使用することにします。

ご利用のサーバーにAuthen::Captchaがすでにインストールされているのであれば、すぐに使えます。XREAなどでは、Authen::Captchaがインストールされています。

もしインストールされていないのであれば、インストールします。レンタルサーバーを利用している場合は、管理人にお願いしてみてください。

管理人からインストールを拒否された場合は、自分でインストールします。その方法は、「小粋空間: Authen::Captcha をインストールして Captcha Plugin を利用する(CPAN による perl モジュールのインストール)」が参考になります。

自分でインストールすることもできない場合は、次のような方法で使えるようになるかもしれません。

  1. Yomi-Searchがインストールされているディレクトリ("regist_ys.cgi"があるディレクトリ)に"Authen"という名前のディレクトリを作成する。
  2. Authen::Captcha」からアーカイブをダウンロードし、展開する。
  3. 展開してできたファイル"Captcha.pm"とフォルダ"Captcha"丸ごとを、"Authen"ディレクトリにコピー(アップロード)する。
  4. 以上。

ディレクトリの作成

ここからが本番です。まず、データを保存するディレクトリと、画像を保存するディレクトリを作成します。ここでは、Yomi-Searchを設置したディレクトリに"data"と"images"という2つのディレクトリを作成して、それぞれをデータを保存するディレクトリと、画像を保存するディレクトリにします。これらのディレクトリには適当なパーミッション(777など)を設定ます。

"$captcha->data_folder"に作成されるファイルには外部から見られないようにする必要があります。例えば、".htaccess"を作成して、"deny from all"と書いておきます。".htaccess"が使えなければ、"$captcha->data_folder"のディレクトリの名前を誰も想像しないような複雑なものにしておきます。

"regist_ys.cgi"の改造

次に、Yomi-Searchを改造します。Yomi-Searchのバージョンは、4.21とします。

まず、"regist_ys.cgi"をテキストエディタで開いて、その最後に次のようなコードを追加します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
sub create_captcha_object {
    use Authen::Captcha;
    # create a new object
    my $captcha = Authen::Captcha->new();
    # set the data_folder. contains flatfile db to maintain state
    $captcha->data_folder('./data');
    # set directory to hold publicly accessable images
    $captcha->output_folder('./images');
    #$captcha->width(25);
    #$captcha->height(35);
    #$captcha->expire(300);
    
    return $captcha;
}
 
sub generate_captcha {
    $captcha = &create_captcha_object;
    
    # create a captcha. Image filename is "$md5sum.png"
    my $md5sum = $captcha->generate_code(4);
    
    return $md5sum;
}
 
sub check_captcha {
    if ($FORM{mode} eq "act_mente" || $FORM{changer} eq "admin" ||
     $FORM{'preview'} eq "on") {
        return;
    }
    
    $captcha = &create_captcha_object;
    
    # check for a valid submitted captcha
    #   $code is the submitted letter combination guess from the user
    #   $md5sum is the submitted md5sum from the user (that we gave them)
    my $results = $captcha->check_code($FORM{captcha},$FORM{captchamd5});
    # $results will be one of:
    #          1 : Passed
    #          0 : Code not checked (file error)
    #         -1 : Failed: code expired
    #         -2 : Failed: invalid code (not in database)
    #         -3 : Failed: invalid code (code does not match crypt)
    if($results == -3){
        &mes("<b>認証コード</b>が正しくありません","認証エラー","back_reg");
    } elsif ($results == -1){
        &mes("<b>認証コード</b>の有効期限が切れました","認証エラー","back_reg");
    } elsif ($results != 1){
        &mes("<b>認証コード</b>のチェックに失敗しました","認証エラー","back_reg");
    }
}
 
sub get_captcha_html {
    if ($FORM{mode} eq "act_mente" || $FORM{changer} eq "admin") {
        return '';
    }
    
    my $md5sum = &generate_captcha;
    
    if (!$_[0]) {    
        return<<"<!--HTML-->";
 
    <br><li>【認証コード】
        <ul>※下の画像に表┐気譴討い詈源(アルファベットと数字)
        を入力してください。<br>
        ※プレビューする場合は、プレビュー画面で認証コードを入力するため、
        ここで入力する必要はありません。<br>
        ※何らかの理由により画像を読むことができない場合は、その理由を明記して、
        管理人までご連絡ください。<br>
        <img src="captcha/img/$md5sum.png" alt="認証コード"><br>
        <input type=text name=captcha value="$FORM{captcha}" size=30>
        <input type=hidden name=captchamd5 value="$md5sum">
        </ul><br>
<!--HTML-->
    } else {
        return<<"<!--HTML-->";
 
    <br><li>【認証コード】
        <ul>※下の画像に表┐気譴討い詈源(アルファベットと数字)
        を入力してください。<br>
        ※何らかの理由により画像を読むことができない場合は、その理由を明記して、
        管理人までご連絡ください。<br>
        <img src="captcha/img/$md5sum.png" alt="認証コード"><br>
        <input type=text name=captcha value="$FORM{captcha}" size=30>
        <input type=hidden name=captchamd5 value="$md5sum">
        </ul><br>
<!--HTML-->
    }
}

次に、749行目あたりにある

  1
&check; #入力内容のチェック

  1
&lock; #ロック

の間に、次のようなコードを挿入します。

  1
&check_captcha;

設定の変更

上記のコードのうち、設定に関係のある部分を説明します。

create_captcha_objectの"$captcha->data_folder"にデータを保存するディレクトリを指定します。また、"$captcha->output_folder"に作成される画像を保存するディレクトリを指定します。

"$captcha->width"と"$captcha->height"には、一文字あたりの画像のサイズを指定します。指定しないと、25と35になります。

"$captcha->expire"には、Captchaの有効期間を秒単位で指定します。画像が作成されてから入力された値が正しいかチェックするまでの有効期間を指定するものと思われます。指定しないと、300になります。

generate_captchaでは、"$captcha->generate_code"で画像を作成します。この時、文字数を指定します。

"get_captcha_html"は、「新規ホームページ登録」ページに表示するCaptchaに関するHTMLコードを返しています。$_[0]が0の時は「新規ホームページ登録」ページで、$_[0]が1の時は「新規ホームページ登録(プレビュー画面)」ページです。「新規ホームページ登録」ページからプレビューする場合はCaptchaを使う必要がないため、そのことをユーザーに知らせています(そうでないと、2回入力することになってしまうので)。

"get_captcha_html"で行っていることはテンプレートファイルに記述したほうがよいかもしれませんが、コードをまとめておきたかったので、ここに記述しました。

テンプレートの改造

次にテンプレートを編集します。編集するテンプレートは、"regist_new.html"と"regist_new_preview.html"です。テンプレートは、templateディレクトリ内にあります。

まず"regist_new.html"をテキストエディタで開いて、180行目あたりの

  1
  2
<!--HTML-->
}

の後ろに次のようなコードを挿入します。

  1
my $captcha_html = &get_captcha_html(0);

そしてその直後の

  1
print<<"<!--HTML-->";

の後ろに

  1
$captcha_html

を挿入します。

"regist_new_preview.html"の場合も同様です。161行目あたりの

  1
  2
<!--HTML-->
}

の後ろに次のようなコードを挿入します。

  1
my $captcha_html = &get_captcha_html(1);

そしてその直後の

  1
print<<"<!--HTML-->";

の後ろに

  1
$captcha_html

を挿入します。

これで、終了です。


ページ情報
[ トップ ]   [ 編集 | 凍結 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]