お世話になります。
メール送信後にブラウザバックを禁止しているページがあるのですが、同じメールが数日後に届くことがあります。
重複送信されるメールのユーザーエージェントと同じ環境でブラウザバックテストをしたところ、正常に下記エラー画面が出ました。
フォーム再送信の確認このウェブページを正しく表示するには、先ほど入力したデータが必要です。データは再送信できますが、このページで先ほど行った操作を繰り返すことになります。
ページの読み込みに必要なデータを再送信するには、再読み込みボタンを押してください。
ERR_CACHE_MISS
数日後に同じページから同じメールが飛んでくるのでなんとか原因を突き止めたいです。
2020/07/11 20:17:59 : http://www.XXX.com/reservation/confirm.php?rand_str=iVuVaHrc : 133.203.XXX.XXX : Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1 2020/07/16 21:52:48 : http://www.XXX.com/reservation/confirm.php?rand_str=iVuVaHrc : 106.72.XXX.XXX : Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1
↑が、重複送信されてきたメールのログ2通分です。
同じURLに行くと、入力無というエラーになります。
使っているコードは以下です。(配布サイト)
<?php header("Content-Type:text/html;charset=utf-8"); ?> <?php //error_reporting(E_ALL | E_STRICT); //トークンチェック用のセッションスタート if($useToken == 1 && $confirmDsp == 1){ session_name('PHPMAILFORMSYSTEM'); session_start(); } $encode = "UTF-8";//このファイルの文字コード定義(変更不可) if(isset($_GET)) $_GET = sanitize($_GET);//NULLバイト除去// if(isset($_POST)) $_POST = sanitize($_POST);//NULLバイト除去// if(isset($_COOKIE)) $_COOKIE = sanitize($_COOKIE);//NULLバイト除去// if($encode == 'SJIS') $_POST = sjisReplace($_POST,$encode);//Shift-JISの場合に誤変換文字の置換実行 $funcRefererCheck = refererCheck($Referer_check,$Referer_check_domain);//リファラチェック実行 //変数初期化 $sendmail = 0; $empty_flag = 0; $post_mail = ''; $errm =''; $header =''; if($requireCheck == 1) { $requireResArray = requireCheck($require);//必須チェック実行し返り値を受け取る $errm = $requireResArray['errm']; $empty_flag = $requireResArray['empty_flag']; } //メールアドレスチェック if(empty($errm)){ foreach($_POST as $key=>$val) { if($val == "confirm_submit") $sendmail = 1; if($key == $Email) $post_mail = h($val); if($key == $Email && $mail_check == 1 && !empty($val)){ if(!checkMail($val)){ $errm .= "<p class=\"error_messe\">【".$key."】はメールアドレスの形式が正しくありません。</p>\n"; $empty_flag = 1; } } } } if(($confirmDsp == 0 || $sendmail == 1) && $empty_flag != 1){ //トークンチェック(CSRF対策)※確認画面がONの場合のみ実施 if($useToken == 1 && $confirmDsp == 1){ if(empty($_SESSION['mailform_token']) || ($_SESSION['mailform_token'] !== $_POST['mailform_token'])){ exit('ページ遷移が不正です'); } if(isset($_SESSION['mailform_token'])) unset($_SESSION['mailform_token']);//トークン破棄 if(isset($_POST['mailform_token'])) unset($_POST['mailform_token']);//トークン破棄 } //差出人に届くメールをセット if($remail == 1) { $userBody = mailToUser($_POST,$dsp_name,$remail_text,$mailFooterDsp,$mailSignature,$encode); $reheader = userHeader($refrom_name,$from,$encode); $re_subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($re_subject,"JIS",$encode))."?="; } //管理者宛に届くメールをセット $adminBody = mailToAdmin($_POST,$subject,$mailFooterDsp,$mailSignature,$encode,$confirmDsp); $header = adminHeader($userMail,$post_mail,$BccMail,$to); $subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding($subject,"JIS",$encode))."?="; //-fオプションによるエンベロープFrom(Return-Path)の設定(safe_modeがOFFの場合かつ上記設定がONの場合のみ実施) if($use_envelope == 0){ mail($to,$subject,$adminBody,$header); if($remail == 1 && !empty($post_mail)) mail($post_mail,$re_subject,$userBody,$reheader); }else{ mail($to,$subject,$adminBody,$header,'-f'.$from); if($remail == 1 && !empty($post_mail)) mail($post_mail,$re_subject,$userBody,$reheader,'-f'.$from); } } else if($confirmDsp == 1){ /* ▼▼▼送信確認画面のレイアウト※編集可 オリジナルのデザインも適用可能▼▼▼ */ ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> <meta name="format-detection" content="telephone=no"> <title>確認画面</title> </head> <body> <!-- ▼************ 送信内容表示部 ※編集は自己責任で ************ ▼--> <div id="formWrap"> <?php if($empty_flag == 1){ ?> <div align="center"> <h4>入力にエラーがあります。下記をご確認の上「戻る」ボタンにて修正をお願い致します。</h4> <?php echo $errm; ?><br /><br /><input type="button" value=" 前画面に戻る " onClick="history.back()"> </div> <?php }else{ ?> <h3>確認画面</h3> <p align="center">以下の内容で間違いがなければ、「送信する」ボタンを押してください。</p> <form action="<?php echo h($_SERVER['SCRIPT_NAME']); ?>" method="POST"> <table class="formTable"> <?php echo confirmOutput($_POST);//入力内容を表示?> </table> <p align="center"><input type="hidden" name="mail_set" value="confirm_submit"> <input type="hidden" name="httpReferer" value="<?php echo h($_SERVER['HTTP_REFERER']);?>"> <input type="submit" value=" 送信する "> <input type="button" value="前画面に戻る" onClick="history.back()"></p> </form> <?php } ?> </div><!-- /formWrap --> <!-- ▲ *********** 送信内容確認部 ※編集は自己責任で ************ ▲--> if(($jumpPage == 0 && $sendmail == 1) || ($jumpPage == 0 && ($confirmDsp == 0 && $sendmail == 0))) { } } //確認画面無しの場合の表示、指定のページに移動する設定の場合、エラーチェックで問題が無ければ指定ページヘリダイレクト else if(($jumpPage == 1 && $sendmail == 1) || $confirmDsp == 0) { if($empty_flag == 1){ ?> <div align="center"><h4>入力にエラーがあります。下記をご確認の上「戻る」ボタンにて修正をお願い致します。</h4><div style="color:red"><?php echo $errm; ?></div><br /><br /><input type="button" value=" 前画面に戻る " onClick="history.back()"></div> <?php }else{ header("Location: ".$thanksPage); } }
上記コードにブラウザバック禁止処理をつけています。
js
1<script type="text/javascript"> 2window.onunload = function(){}; 3history.forward(); 4</script>
ブラウザバックをして、メール送信ボタンを再度押しているのかリロードでメールが送られてしまうのかもわかりません。
トークンで制御などの前に、こちらの問題の原因を突き止めたいです。
こちらのコードにメールが二重送信されてしまう箇所などはございますでしょうか。
お力添え戴ければと存じます。よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー