電子書籍の厳選無料作品が豊富!

cgiを直接呼び出して、メールを送信されてしまうエラーについて質問させてください。

以下のように、sendmailを利用するサブルーチンを呼び出しています。

if ($query->param('confirm')) { #←初期値は""で一番下のelseに飛ぶ
# input data check
my @err_lst = (); #←入力チェックしてエラーメッセージを蓄積
if (&InputCheck($query, \@err_lst)) {#←入力内容をチェック
# ok
&NextPage($query); #←確認画面を表示
} else {
# error
&SamePage($query); #入力内容にエラーがある場合、入力画面に戻す
}
} elsif ($query->param('send') eq "送信") {
# send mail & make log
&SendMail($query); #メール送信用サブルーチン
} else {
# make init form
&InitPage($query); #CGI起動直後はこのサブルーチンから入力フォームを表示
}

この書き方ですと、
<input type="hidden" name="confirm" value="">
<input type="hidden" name="send" value="送信">
で、直接「&SendMail($query);」が起動してメール送信されてしまいます。

メール本文やアドレスの文字エスケープ処理は動いているのですが、
sendmailを呼び出す前には、必ず入力内容をチェックするサブルーチンを通る事を
強制する方法はないでしょうか。

当方、この修正の為にこの2週間突貫でPERLを独学している素人の為、
上記事例について読んでおくべき参考書などがあれば、お教えいただけますと
とてもとても助かります。

どうぞよろしくお願いいたします。

A 回答 (3件)

フローチャートを書いてみましょう。


それでは、エラーがなければ送信されますよね。
 確認画面に、チェック用のinput hiddenでコードを含めて、そのコードがなければ確認画面を表示する。あれば送信とすれば良いです。
 この値は、時間コードにしてチェックすると、時間をチェックできるでしょう。必要なら暗号化したものにしてチェックするとか。
    • good
    • 0
この回答へのお礼

ORUKA1951さん さっそくお応えいただきましてありがとうございます。

動的に変化するコードをHTMLに書き戻せばいいのですね!
サブルーチンの呼び方ばかりに気がいってしまって、思いつきませんでした!
それと、フローチャートを作って考えました。そうですよね。エラーがないんですから送信されてしまいますよね…

ご指摘いただきました通り、
 $tm=localtime()
 my $hh=$tm->hour;
で、$hhをHTMLに書き戻し、
[確認画面を表示した時間]=[sendmailを呼んだ時間]でなかったら
sendmailを呼べない、という仕様にしてみました。
でもこれだと、確認画面のソースをよくよく見ると、何を仕込んだかバレてしまう気がして
悩みます…

もう少し工夫してみます。
ヒントを下さって、本当にありがとうございます!

お礼日時:2013/01/21 21:18

No.1です。


簡単な方法のアドバイスを
Perlの、__DATA__を使うと良いでしょう。
perlスクリプトの終了はソースの最後に
__END__
でしたね。その後に書かれたものは、本体から<DATA>で利用することができます。

Perlスリスクリプトの最後に、今使用しているフォームを書いてその中にキー
ワードを含めておきます。
入力がないとき、入力があってエラーがあるときは、whileで出力
エラーがないときは、確認画面のフォームを出力するとかです。

#!/usr/local/bin/perl
・・・スクリプト・・・
if($user-Time < $now + 20000 && $user-Time > $now){
・・・・エラー処理・・・
$errorCount ++;
# $error{'name'}の値を代入
$error{'name'} = '<strong style="color:red;font-weight:bold">名前が記入
されていません</strong><br& gt;';
}
・・・【中略】・・・
if $errorCount >0{
while(<DATA>) {
s/\[nameError\]/$error{'name'}/g;
s/\[now-Time\]/$time/g;
s/\[USER_NAME\]/$in{'user'}/g;
s/\[TEXT\]/$in{'name'}/g;
print ;
print "\n";
}
}
・・・スクリプト・・・・
__END__
<html lang="la">
・・・【中略】・・・
<form action="[THIS_FORM]" method="post">
<input type="hidden" name="keyword" value="[now-Time]">
・・・【中略】・・・
[nameError]
<input type="text" name="user" value="[USSER_NAME]" size="20">
<input type="text" name="name" value="[TEXT]" size="20">
    • good
    • 0

&SendMail($query) の直前でも &InputCheck($query, \@err_lst)) して、エラーがあれば、&SamePage($query) で入力ページに戻すというのではダメですか。

この回答への補足

お礼が遅れて申し訳ありません。
入力ページに戻す方法も検討してみます。とすると、入力ページを表示させるフローの見直しが必要ですね…
難しい…
もう少しがんばってみます。
ありがとうございました。

補足日時:2013/02/04 17:01
    • good
    • 0
この回答へのお礼

補足欄にお礼を書いてしまいました…

「お礼」欄にも同じ内容を入力いたします。すみません。

お礼が遅れて申し訳ありません。
入力ページに戻す方法も検討してみます。とすると、入力ページを表示させるフローの見直しが必要ですね…
難しい…
もう少しがんばってみます。
ありがとうございました。

お礼日時:2013/02/04 17:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!