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

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

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

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Webサイト

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

PHP

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

メール

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1756閲覧

動的に生成した数字を埋め込んだURLは何度も開けるか

meli

総合スコア312

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Webサイト

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

PHP

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

メール

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/07/20 06:20

編集2020/07/20 06:44

お世話になっております。

現在、旅行の予約サイトを運営しています。
個人情報の入力:input.html
確認:confim.php
完了:thanks.php
と遷移します。

confim.phpには末尾にランダムの数字を割り振っております。
SESSIONを使用し、ブラウザバックを禁止しております。
検証端末では、タブの複製やURLのコピーをしても入力情報は消えます。
例)https://www.XXX.com/confirm.php?rand_str=ABC123456

しかし、連日同じメールが何度も届くことがあります。
ブラウザの更新をしても送信されない仕様なので、ページを開きなおしたわけでもなさそうです。
(そもそもthanks.phpから数秒後にトップページに遷移される)

メール送信判定:confirm.php

confirm.php

1// メール取得済み&ここまででエラーがなければメール送信フラグ取得 2// confirmページから下記Valueが渡されていたらメール送信処理へ進んでよい。 3if (empty($error_msg) && !empty($post_mail)) { 4 if (!empty($_POST['HiddenMailSendOK']) && $_POST['HiddenMailSendOK'] === "mail_is_ok") { 5 $sendmail = 1; 6 }

動的URL生成:input.php

input.php

1 // 規定の組み合わせからランダムな文字列を返却 2 function getRndStr() { 3 var str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 4 var len = 8; 5 var ret = ""; 6 for (var i = 0; i < len; i++) { 7 ret += str.charAt(Math.floor(Math.random() * str.length)); 8 } 9 return ret; 10 } 11 // submitボタン処理 12 function sendConfirm() { 13 if (checkRequire() !== true) { 14 return false; 15 } 16 17 // 飛び先キャッシュ回避 18 document.main_form.action = "confirm.php?rand_str=" + getRndStr(); 19 20 return true; 21 }

原因の切り分けを行いたいのですが、テスト環境では再現できず。
confirm.php?rand_str=ABC123456を複数回開くにはどういった動作が必要でしょうか?

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

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

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

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

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

yambejp

2020/07/20 06:52

同じメールはどのくらいの時間差で届きますか? confirmで受けたリクエストは、バリデートして問題がなければ headerでthanksに飛ばしているということですよね?
meli

2020/07/20 07:22 編集

ご返信ありがとうございます。 メールが届く時間差としてはまちまちで、同日の10分後、翌日、1週間後の時間帯はバラバラなど、規則性がないです。(下記が1人分の例です) 2020/07/10 23:11:03 2020/07/11 20:16:32 2020/07/11 20:17:59 2020/07/15 20:02:04 2020/07/16 21:52:48 >confirmで受けたリクエストは、バリデートして問題がなければ headerでthanksに飛ばしているということですよね? そちらの認識で合っております。
guest

回答2

0

ベストアンサー

confirm.php?rand_str=ABC123456を複数回開くにはどういった動作が必要でしょうか?

confirm.phpからthanks.phpに移動した後にリロードをするか、ブラウザのバックボタンで戻ればいけそうな気がします。


そもそも論としては、

confim.phpには末尾にランダムの数字を割り振っており、タブの複製やURLのコピーをしても入力情報は消える仕様としております。

だけだと多重送信の対応にはなりません。
ワンタイムトークンを使って多重送信を防ぐ(CSRF対策としても必要)ことをお勧めします。
php csrf tokenphp easycsrfあたりで検索するとわかりやすい説明があります。

投稿2020/07/20 06:34

tanat

総合スコア18727

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

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

meli

2020/07/20 06:36

ご回答ありがとうございます。 記載しておらず申し訳ないのですが、SESSIONを使って前ページに戻れないようにしております。 検証端末では、ブラウザバックは禁止できていることを確認しております。
tanat

2020/07/20 06:47 編集

リロードやブラウザバック以外だと、 開発者ツールでHTTPリクエストのログを表示するようにして再現する とか postman等のツールを使ってリクエストを再現する あたりが良くある方法ですね ワンタイムトークンを実装していないSESSIONでの制御は本質的に多重送信を防ぐことは出来ませんし、「ブラウザバックの禁止」がどの様に行われているかわかりませんが、ブラウザ自身がキャッシュしている場合のサーバ通信を伴わないブラウザバックを防ぐのは困難ですので、 元々限定的な条件でしか多重送信防止が出来ていないのだと思いますよ。 JavaScriptによる制御もクライアントサイドで実行される以上、完璧にはなり得ません。
tanat

2020/07/20 06:49

ので、無限に存在するクライアント毎の挙動に対応するよりは、 根本的な対応をされることをお勧めします(現代のフォームにおいてはCSRF対策は必須でしょうし)
meli

2020/07/20 06:52

ご返信ありがとうございます。 再現方法のご教示ありがとうございます。 そちらについて調べてみます。 >元々限定的な条件でしか多重送信防止が出来ていない 仰る通りです。 <script type="text/javascript"> window.onunload = function(){}; history.forward(); </script> 上記方法で、とりあえずブラウザバックを禁止している現状ですので、 二重submit対策自体を根本的に改修する必要がありますね。
tanat

2020/07/20 06:59

そうですね。 バックエンドで根本的な対策をした上で、JavaScriptでUI上の使いやすさを調整するのが良くある方法かと思います。
meli

2020/07/20 08:08

ありがとうございます。 一旦バックエンド側での制御を見直してみます。
guest

0

どうしてもということなら、メール送信情報をDBに保持して、
特定のユーザーからのメールは30分とか1時間以内で送れないようフラグをたて
2通目以降を阻止するとかも考えられます

投稿2020/07/20 07:22

yambejp

総合スコア116724

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

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

meli

2020/07/20 07:37

ご回答ありがとうございます。 DBでの制御も検討してみます。 再読み込みができない(はずの)URLへ飛ぶ方法はないですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問