KENT WEBのpatioの迷惑書き込みの防止策の追加。変更部分のみコードのメモ。

patio_20170522

  • ファイル:regist.cgi
  • form_checkで、タイトルの日本語全角文字数による書き込み制限。
#-----------------------------------------------------------
#  フォーム入力チェック
#-----------------------------------------------------------
sub form_check {
	# 改行カット
	$in{sub}  =~ s/<br>//g;
	$in{name} =~ s/<br>//g;
	$in{pwd}  =~ s/<br>//g;
	$in{captcha} =~ s/<br>//g;
	$in{comment} =~ s/(<br>)+$//g;
 
	# コード変換
	if ($cf{chg_code} == 1) {
		require Jcode;
		Jcode->new($in{name})->sjis;
		Jcode->new($in{comment})->sjis;
	}
 
	# チェック
	if ($cf{no_wd}) { no_wd(); }
	if ($cf{jp_wd}) { jp_wd(); }
	if ($cf{urlnum} > 0) { urlnum(); }
 
	# 未入力の場合
	$in{sub} ||= '無題';
	if ($in{url} eq 'http://') { $in{url} = ''; }
 
	# 投稿内容チェック
	my $err;
 
	my $in_sub;
# 2017-05-22 vvvvv
	my ($one, $two)=kazoeru($in{sub});
	if ($two<5) {
		$err .= "入力チェック制限No01により保存は出来ません:".$two."<br>";
	}
# 2017-05-22 ^^^^^
	if ($in{name} eq "") { $err .= "名前は記入必須です<br>"; }
	if ($in{email} ne '' && $in{email} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
		$err .= "E-mailの入力内容が不正です<br>";
	}
	if ($in{url} ne '' && $in{url} !~ /^https?:\/\/[\w-.!~*'();\/?:\@&=+\$,%#]+$/) {
		$err .= "URL情報が不正です<br>";
	}
	if ($in{comment} eq "") { $err .= "コメントの内容がありません<br>"; }
	if (length($in{comment}) > $cf{max_msg} * 2) {
		&error("コメントは全角$cf{max_msg}文字以内で記述してください<br>");
	}
	error($err) if ($err);
}
 
 
# 2017-05-22 vvvvv
# https://oshiete.goo.ne.jp/qa/1095448.html より
sub kazoeru {
	#戻り値 (1バイト文字の数,2バイト文字の数)
	my($one, $two);
	$one = 0;
	$two = 0;
	while ($_[0] =~ /([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])|./g) {
		if (defined $1) {
			# 2バイト文字を1個発見!!
			$two++;
		} else {
			# 違ったみたい..1バイト文字としてカウント
			$one++;
		}
	}
 
	return ($one, $two);
}
# 2017-05-22 ^^^^^




patio_20170520

ファイル:regist.cgi

850行目付近

修正前

	# 投稿内容チェック
	my $err;
	if ($in{name} eq "") { $err .= "名前は記入必須です<br>"; }
	if ($in{email} ne '' && $in{email} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
		$err .= "E-mailの入力内容が不正です<br>";
	}
	if ($in{url} ne '' && $in{url} !~ /^https?:\/\/[\w-.!~*'();\/?:\@&=+\$,%#]+$/) {
		$err .= "URL情報が不正です<br>";
	}
	if ($in{comment} eq "") { $err .= "コメントの内容がありません<br>"; }
	if (length($in{comment}) > $cf{max_msg} * 2) {
		&error("コメントは全角$cf{max_msg}文字以内で記述してください<br>");
	}
	error($err) if ($err);
}

	my $err;

の後に

	my $in_sub;
	$in_sub = $in{sub};
	$in_sub =~ s/[a-zA-Z0-9!"#$%&'()-=~_<>]//g;
	if (length($in_sub)<20) {
		$err .= "入力チェック制限No01により保存は出来ません<br>";
	}

を追加します。

修正後

	# 投稿内容チェック
	my $err;
	my $in_sub;
	$in_sub = $in{sub};
	$in_sub =~ s/[a-zA-Z0-9!"#$%&'()-=~_<>]//g;
	if (length($in_sub)<20) {
		$err .= "入力チェック制限No01により保存は出来ません<br>";
	}
	if ($in{name} eq "") { $err .= "名前は記入必須です<br>"; }
	if ($in{email} ne '' && $in{email} !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
		$err .= "E-mailの入力内容が不正です<br>";
	}
	if ($in{url} ne '' && $in{url} !~ /^https?:\/\/[\w-.!~*'();\/?:\@&=+\$,%#]+$/) {
		$err .= "URL情報が不正です<br>";
	}
	if ($in{comment} eq "") { $err .= "コメントの内容がありません<br>"; }
	if (length($in{comment}) > $cf{max_msg} * 2) {
		&error("コメントは全角$cf{max_msg}文字以内で記述してください<br>");
	}
	error($err) if ($err);
}


ファイル全体

2017-05-20時点のものを変更しています。バージョンが違うかもしれません。

使えそうなら、ファイル名をregist.cgiにリネームしてアップロードします。オリジナルのファイルはバックアップしておき、もし動かない場合はバックアップしたものを戻して下さい。