kamosica.jp

« Biot 1.01が出てた | メイン | MovableType 3.36のTrackback.pm »

2008年1月14日

Perl Authen::Captchaを人が見やすくする修正 >>Perl 

PerlのAuthen::Captchaを人が見やすくするために、修正をかける。

oO0Iilb6といった文字列はCaptchaでぐちゃぐちゃにされると人が判別することが難しくなる。
SPAM対策のためだけれども、入力した人はげんなりすることが多い。
ということで個人的にCaptchaを使うのはやめているけれど、「わかんねーよー」という声が上がってきてしまうので、ちょっと対応しておこうかなと。

Authen::Captchaにおいて、任意の文字列を生成しているのはfunctionである generate_random_stringになります。

一応、改変したpmをテキスト化したものを置いておきます。ダウンロードはこちら

どうでもいいけど、このコードだと、ランダム値が偏りそうにも見えるけど、ランダムはどうせランダムだからまぁいーか。とりあえずその辺りはオリジナルのままってことで。

動作を確認し、判別し難い文字があるようなら、ProhibitionChars に、同様に追加してみてください。
手で書き換えられるならば、sub generate_random_string_orginal とかにして保存しておいて、以下のように書き換えます。


sub generate_random_string
{
	ref(my $self = shift) or croak "instance variable needed";
	my $length = shift;

	my @ProhibitionChars =(
		'0',
		'o',
		'O',
		'I',
		'l',
		'i',
		'b',
		'6',
	);
	my ($match,$ProhibitionChar);

	# generate a new code
	my $code = "";
	for(my $i=0; $i < $length; $i++)
	{ 
		my $char;
		my $list = int(rand 4) +1;
		if ($list == 1)
		{ # choose a number 1/4 of the time
			$char = int(rand 7)+50;
		} else { # choose a letter 3/4 of the time
			$char = int(rand 25)+97;
		}

		$char = chr($char);

		#Add code by debizoh. 2008.01.14
		$match = 0;
		foreach $ProhibitionChar (@ProhibitionChars)
		{
			if ($ProhibitionChar eq $char)
			{
				$match = 1;
				last;
			}
		}
		if ($match == 1)
		{
			$i = length($code) -1;
			next;
		}

		$code .= $char;
		$i = length($code) -1;

	}
	return $code;
}

twitterこの記事をTwitterでみんなに教える。

投稿者 debizoh : 2008年1月14日 16:56



トラックバック

現在、この記事はトラックバックを受け付けておりません。


コメント

現在、この記事はコメントを受け付けておりません。