人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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;

}

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

●質問者: kasai-de_eb
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008
●200ポイント ベストアンサー

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

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;
}
}

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


rouge_2008さんのコメント
もしメールフォームに入力されたメールアドレスの同一チェックなのでしたら、「if($_ =~/^From:/) { ?}」の分岐処理は必要ないように思います。 「From:」というのはメールのFromヘッダだと思いますが、フォームから入力されただけの状態(※メール送信前)は、メールアドレスにヘッダはまだつきませんので・・・

kasai-de_ebさんのコメント
ご回答いただきありがとうございます。ハイフンの件は解消しました。 ありがとうございました。 「●●-0182@携帯.ne.jp」の様にハイフンの後に0「ゼロ」がくると500エラーになるのは上記記載の部分のエラーなのでしょうか。 もしわかるようでしたら教えてください。お願いいたします。

rouge_2008さんのコメント
ハイフンの後に0が続くメールアドレスの時だけ500エラーが発生するのですか? 私が知る限り、500エラーはCGIその物にエラーがある場合に発生しますので、原因は分かりません。 試しに以下のスクリプトを実行してみてください。(※パスは環境に合わせて変更してください。) ・間違いが無いので500エラーにはなりませんが、表示の処理を実行していないので、何も表示されません。(※タイトルバーにタイトルだけ表示されます。) >|| #!/usr/bin/perl # print "Content-Type: text/html; \n\n"; print "<title>ERROR TEST</title>\n"; #&view; sub view { $u_name = "xxxxx"; print "My name is " . $u_name; } exit; ||< ・エラーのあるスクリプトなので、500エラーが発生します。 >|| #!/usr/bin/perl # print "Content-Type: text/html; \n\n"; print "<title>ERROR TEST</title>\n"; #&view; sub view { # わざと次の行末の;を削除してあります。 $u_name = "xxxxx" print "My name is " . $u_name; } exit; ||< 上記のように処理実行の有無に関わらず、CGIスクリプトにエラーがあれば500エラーが発生しますので、ハイフンの後に0がつく時だけエラーが発生する状況は思いつきません。 メールアドレス以外に、何か他の部分を変更していないでしょうか? ※最終的にどのコードで確認しているのでしょうか?

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

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等)が分かると返答しやすいです。 他に必要な事が出来れば、その都度追加して確認させていただきます。 こちらに返信していただきましたら、分かった場合はもちろん、分からなかった場合も、ここに何らかの返信をしますので・・・
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ