'''現在執筆中です。'''

*Yomi-SearchにCaptchaを付ける [#a1f06d33]

ここでは[[Yomi-Search(ヨミサーチ)>http://yomi.pekori.to/yomi-search.shtml]]にCaptchaを付ける方法を紹介します。Captchaとは、読みにくい文字を表示した画像を投稿者に解読させることにより、人間が投稿することを確かめる方法です。詳しくは、[[Wikipediaの解説>http://ja.wikipedia.org/wiki/Captcha]]をご覧ください。

**Authen::Captcha [#fd4edb19]

ここでは、[[Authen::Captcha>http://search.cpan.org/search?dist=Authen-Captcha]]を使用することにします。そのため、まずはAuthen::Captchaをインストールする必要があります。もしレンタルサーバーを利用している場合は、管理人にお願いしてください。ちなみに、[[XREA>http://www.xrea.com/]]などでは、Authen::Captchaがインストールされています。

**ディレクトリの作成 [#b2080902]

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

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

**"regist_ys.cgi"の改造 [#fede1f1f]

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

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

#code(perl){{
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行目あたりにある

#code(perl){{
&check; #入力内容のチェック
}}

と

#code(perl){{
&lock; #ロック
}}

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

#code(perl){{
&check_captcha;
}}

**設定の変更 [#t22ab37c]

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

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

**テンプレートの改造 [#ia1480c8]

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

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

#code(perl){{
<!--HTML-->
}
}}

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

#code(perl){{
my $captcha_html = &get_captcha_html(0);
}}

そしてその直後の

#code(perl){{
print<<"<!--HTML-->";
}}

の後ろに

#code(perl){{
$captcha_html
}}

を挿入します。

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

#code(perl){{
<!--HTML-->
}
}}

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

#code(perl){{
my $captcha_html = &get_captcha_html(1);
}}

そしてその直後の

#code(perl){{
print<<"<!--HTML-->";
}}

の後ろに

#code(perl){{
$captcha_html
}}

を挿入します。

これで、終了です。

//これより下は編集しないでください
#pageinfo(,2007-05-11 (金) 01:58:08,DOBON!,2007-05-12 (土) 00:47:38,)
[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]