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

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

ただいまの
回答率

87.94%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 850

score 204

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

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

上記コードにブラウザバック禁止処理をつけています。

<script type="text/javascript">
window.onunload = function(){};
history.forward();
</script>

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Space-Monkey

    2020/08/03 16:57

    キャッシュじゃないのか

    キャンセル

  • meli

    2020/08/03 17:19

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

    キャンセル

  • Space-Monkey

    2020/08/03 17:46

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

    キャンセル

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る