質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

2872閲覧

二重送信防止処理をしているが、同じメールが数日後に届いてしまう[WordPress]

meli

総合スコア312

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

1クリップ

投稿2020/08/03 03:44

編集2020/08/03 07:18

お世話になります。
メール送信後にブラウザバックを禁止しているページがあるのですが、同じメールが数日後に届くことがあります。
重複送信されるメールのユーザーエージェントと同じ環境でブラウザバックテストをしたところ、正常に下記エラー画面が出ました。

フォーム再送信の確認このウェブページを正しく表示するには、先ほど入力したデータが必要です。データは再送信できますが、このページで先ほど行った操作を繰り返すことになります。
ページの読み込みに必要なデータを再送信するには、再読み込みボタンを押してください。
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>

ブラウザバックをして、メール送信ボタンを再度押しているのかリロードでメールが送られてしまうのかもわかりません。
トークンで制御などの前に、こちらの問題の原因を突き止めたいです。
こちらのコードにメールが二重送信されてしまう箇所などはございますでしょうか。
お力添え戴ければと存じます。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/03 07:57

キャッシュじゃないのか
meli

2020/08/03 08:19

ご回答ありがとうございます。 ブラウザバック禁止&履歴からメール送信画面に飛ぶと入力不備でエラーの処理をしているのですが どこでキャッシュが動く可能性がありますかね? ブラウザバックできてしまう、等でしょうか? 無知で申し訳ございません。
退会済みユーザー

退会済みユーザー

2020/08/03 08:46

どのようなサーバーなのか どのようなプラグインを使っているのか .htaccessに何か書いているのか
guest

回答1

0

自己解決

CSFR等の可能性がでてきたのでそちらの方向で調べてみます。
ありがとうございました。

投稿2020/08/04 03:28

meli

総合スコア312

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問