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を独学している素人の為、
上記事例について読んでおくべき参考書などがあれば、お教えいただけますと
とてもとても助かります。
どうぞよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
フローチャートを書いてみましょう。
それでは、エラーがなければ送信されますよね。
確認画面に、チェック用のinput hiddenでコードを含めて、そのコードがなければ確認画面を表示する。あれば送信とすれば良いです。
この値は、時間コードにしてチェックすると、時間をチェックできるでしょう。必要なら暗号化したものにしてチェックするとか。
ORUKA1951さん さっそくお応えいただきましてありがとうございます。
動的に変化するコードをHTMLに書き戻せばいいのですね!
サブルーチンの呼び方ばかりに気がいってしまって、思いつきませんでした!
それと、フローチャートを作って考えました。そうですよね。エラーがないんですから送信されてしまいますよね…
ご指摘いただきました通り、
$tm=localtime()
my $hh=$tm->hour;
で、$hhをHTMLに書き戻し、
[確認画面を表示した時間]=[sendmailを呼んだ時間]でなかったら
sendmailを呼べない、という仕様にしてみました。
でもこれだと、確認画面のソースをよくよく見ると、何を仕込んだかバレてしまう気がして
悩みます…
もう少し工夫してみます。
ヒントを下さって、本当にありがとうございます!
No.3
- 回答日時:
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">
No.2
- 回答日時:
&SendMail($query) の直前でも &InputCheck($query, \@err_lst)) して、エラーがあれば、&SamePage($query) で入力ページに戻すというのではダメですか。
この回答への補足
お礼が遅れて申し訳ありません。
入力ページに戻す方法も検討してみます。とすると、入力ページを表示させるフローの見直しが必要ですね…
難しい…
もう少しがんばってみます。
ありがとうございました。
補足欄にお礼を書いてしまいました…
「お礼」欄にも同じ内容を入力いたします。すみません。
お礼が遅れて申し訳ありません。
入力ページに戻す方法も検討してみます。とすると、入力ページを表示させるフローの見直しが必要ですね…
難しい…
もう少しがんばってみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
例外処理のフローチャートの記...
-
サブルーチンを認識しません。
-
モジュールとサブルーチン
-
ExcelVBA AddinでOnAction
-
Excel VBAで、ユーザーフォー...
-
”:”がいっぱいの文について。
-
ACCESSのVBAでPrivate Sub ~en...
-
FortranをCに書き直すにはどう...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 『Call』で呼び出す...
-
ユーザー定義関数に#NAME?が返...
-
VBAでoutlook365が起動しません。
-
VBAで別モジュールへの変数の受...
-
モジュールの最大数はいくつな...
-
ユーザーフォームに最小化・最...
-
VBでグローバル変数を宣言するには
-
'Range'メソッドは失敗しました
-
Excel VBAで、ユーザーフォーム...
-
エクセルVBAでシートモジュール...
-
Excelシート内セル記述の違いに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
例外処理のフローチャートの記...
-
Excel VBAで、ユーザーフォー...
-
モジュールとサブルーチン
-
”:”がいっぱいの文について。
-
オフコン(富士通Kシリーズ)...
-
ExcelVBA AddinでOnAction
-
ACCESSのVBAでPrivate Sub ~en...
-
Attempt to free unreferenced ...
-
VBAで2重のDoLoop関数から抜け...
-
COBOLで、Shellを起動するには?
-
GOSUB命令とは
-
サブルーチンを認識しません。
-
同じコンボボックス、リストボ...
-
Perlのスレッド?
-
サブルーチンを外部ファイルで...
-
配列と互換性のない型の要素に...
-
サブルーチンの中にサブルーチ...
-
初心者です。Perlではどんな時...
-
プログラミング Fortran
-
サブルーチンを使った再帰的な...
おすすめ情報