CGIについて質問です。


DreamweaverCS5  Windows Vista

下記文中のどこかの部分がひっかかり「-」(ハイフン)の入ったアドレスの場合にエラーがでます。
プログラムのつながりがあるので現在のかたちを変えずに修正する場合はどうしたらいいのでしょうか?

# メールアドレスの判定

# パラメータ:(判定文字列,チェックするアドレス)

# 1: OK, 0: NG

sub xxx_chk_user {

my $fromadd;

my $chkadd;

$_ = shift;

$chkadd = shift;

if($_ =~/^From:/) {

if($_=~/<([^>]+)>/){

$fromadd = $1;

}

elsif($_ =~m|[\t]*([a-zA-Z0-9\.\-\/]@[a-zA-Z0-9\.\-\/]+)[\s]*|){

$fromadd = $1;

}

if ($fromadd ne $chkadd) {return 0;}

} else {return 1;}

return 1;

}

if ($fromadd ne $chkadd) {return 0;}

} else {return 1;}

return 1;

}

質問自体はおかしいのかも知れませんがわかる方がいたらお願いします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2012/02/08 12:19:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント200pt

メールアドレス欄と確認用メールアドレス欄に入力されたメールアドレスの同一チェックでしょうか?
閉じる場所が不適切な為か、メールアドレスに「-」の有無に関わらずエラーが発生する状態でした。
以下のように修正すると動作しますので、試してみてください。

sub xxx_chk_user {

	my $fromadd;
	my $chkadd;

	$_ = shift;
	$chkadd = shift;

	if($_ =~/^From:/) {

		if($_=~/<([^>]+)>/){
			$fromadd = $1;
		}
	}

	elsif($_ =~m|[\t]*([a-zA-Z0-9\.\-\/]+@[a-zA-Z0-9\.\-\/]+)[\s]*|){
		$fromadd = $1;
	}

	if ($fromadd ne $chkadd) {
		return 0;
	} else {
		return 1;
	}
}


※「[a-zA-Z0-9\.\-\/]」だけだと@の前の1文字しか判定できませんので、「+」を加えて「[a-zA-Z0-9\.\-\/]+」としてあります。
※「elsif($_ =~m|[\t]*([a-zA-Z0-9\.\-\/]+@[a-zA-Z0-9\.\-\/]+)[\s]*|){」の部分は、「elsif($_ =~m|[\t]*([a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+)[\s]*|){」とした方がいいかもしれません。(ブラケット([])の中なので、「./」等に「\」は必要ありませんし、メールアドレスに「\」は含まれないはずです。)


http://www.kent-web.com/perl/chap5.html


【追記】

もしメールヘッダからFromメールアドレスを取得している場合は、次のようにしてください。(※現在の状態では、From以外(「Return-path」等)のメールアドレスを取得する可能性があります。)

	if($_ =~/^From:/m) {
		if($_=~/From:.+\s*?<([^>]+)>/){
			$fromadd = $1;
		}
		elsif($_ =~m|From:[\s\t]*?([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)[\s]*|){
			$fromadd = $1;
		}
	}

※アンダーバー「_」が含まれる場合を考慮していなかったので、正規表現部分にアンダーバーを追加してあります。

他3件のコメントを見る
id:kasai-de_eb

ありがとうございます。
具体例をいただき、とてもわかりやすかったです。
CGIのことがあまりわからず、どんな質問していいのかわからない状態でおります。
一度見直してみて再度ご質問させて頂こうかと思います。
またお時間がありましたらご回答いただけると助かります。

2012/02/08 12:18:59
id:rouge_2008

ポイントとベストアンサーまでありがとうございます。

ハイフンの後に0「ゼロ」がくると500エラーになるとの事でしたが、どのような値をsub xxx_chk_userに渡して実行しているのでしょうか?
ハイフンの後に0が無い場合の動作を確認した後、CGIスクリプト自体の書き換えを行って確認しているのですか?
ケアレスミスの可能性もあるので、書き換えた箇所を確認するといいのですが・・・
(ハイフンの後に0が無い場合にきちんと動作するのでしたら、sub xxx_chk_userの部分はエラーの原因ではないはずです。)

Fromメールアドレスの検索対象がメールヘッダなのか、メールフォームの特定の入力欄の値なのかによって、必要な処理の記述は異なります。(以下は両方対象にしてありますが、必要ない処理は削ってください。)

	if($_ =~/^From:/m) {
	# Fromヘッダが見つかった場合の処理
		if($_=~/From:.+\s*?<([^>]+)>/){
		# Fromヘッダに指定されたアドレスが<>で囲まれている場合の処理 
			$fromadd = $1;
		}
		elsif($_ =~m|From:[\s\t]*?([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)[\s]*|){
		# Fromヘッダに指定されたアドレスが<>で囲まれていない場合の処理 
			$fromadd = $1;
		}
	}

	elsif($_ =~m|[\t]*([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)[\s]*|){
	# メールヘッダ以外が対象の処理(※フォームに入力された値を渡して実行している場合など)
		$fromadd = $1;
	}


・チェック対象のメールアドレスを直接渡している(※メールヘッダからの取得ではない)場合は、以下の処理だけで大丈夫です。

	if($_ =~m|[\t]*([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)[\s]*|){
	# メールヘッダ以外が対象の処理(※フォームに入力された値を渡して実行している場合など)
		$fromadd = $1;
	}

※上記はいづれも$fromaddへの代入部分だけですが、その後の比較チェックの記述も必要です。

メールアドレスごとにCGIを変更して動作確認を行っているのか、その場合どこをどのように変更しているのか、等の他に、このCGIの種類(メールフォームあるいは、メール解析のCGI等)が分かると返答しやすいです。
他に必要な事が出来れば、その都度追加して確認させていただきます。
こちらに返信していただきましたら、分かった場合はもちろん、分からなかった場合も、ここに何らかの返信をしますので・・・

2012/02/09 01:41:14

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません