外部フォーム処理後に、前のページに戻れないようにしたい

2020年8月17日 at 11:32

フォーラムのみなさま

平素は大変お世話になっております。
先日より、外部フォームを作成して、入力されたデータを
Expressへ登録後、回答者メールアドレスへメールを自動返信
するところまで作ることができました。
ありがとうございます。

お教えいただきたいのですが、現在、入力ページから、「送信」
ボタンをクリック後、コントローラ側でExpressへの登録処理と
メール送信処理を行い、正常に終了した場合、外部ブロックに
「回答が完了しました」といったメッセージを表示させております。

しかし、ここでブラウザの戻るボタンや、キーボードのEnterキー
を押下すると、履歴が残っているため、前の回答ページへ移動
できてしまいます。
これを防ぎたいので、外部フォームのビュー側に、Javascriptを使って
履歴を消去する処理を実装してみましたが、戻れてしまいます。
基本的に、回答は1回のみとしたいので、ページを戻って、何度も
回答できてしまうことを何とか防ぎたいと思っておりますが、なにか
よいお知恵はございませんでしょうか?

どうぞよろしくお願いいたします。

【開発環境】
# concrete5 Version
Core Version - 8.5.4
Version Installed - 8.5.4
Database Version - 20200609145307

# Database Information
Version: 5.1.73
SQL Mode:

# concrete5 Packages
None

# concrete5 Overrides
blocks/external_form/form/controller/get_express_data.php, blocks/external_form/form/controller/shop_express_data.php, blocks/external_form/form/controller/touroku_express.php, blocks/external_form/form/controller/hodanren_shika.php, blocks/external_form/form/controller, blocks/external_form/form/get_express_data.php, blocks/external_form/form/shop_express_data.php, blocks/external_form/form/touroku_express.php, blocks/external_form/form/hodanren_shika.php, blocks/external_form/form/frm_conform.php, blocks/external_form/form, blocks/external_form, mail/mail_send.php

# concrete5 Cache Settings
Block Cache - On
Overrides Cache - On
Full Page Caching - Off
Full Page Cache Lifetime - Every 6 hours (default setting).

# Server Software
Apache

# Server API
apache2handler

# PHP Version
7.1.33

# PHP Extensions
apache2handler, bcmath, bz2, calendar, Core, ctype, curl, date, dba, dom, enchant, exif, fileinfo, filter, ftp, gd, gettext, gmp, hash, iconv, imap, intl, json, ldap, libxml, mbstring, mcrypt, mysqli, mysqlnd, odbc, openssl, pcre, PDO, pdo_mysql, PDO_ODBC, pdo_pgsql, pdo_sqlite, pgsql, Phar, posix, pspell, recode, Reflection, session, shmop, SimpleXML, snmp, soap, sockets, SPL, sqlite3, standard, sysvmsg, sysvsem, sysvshm, tidy, tokenizer, wddx, xml, xmlreader, xmlrpc, xmlwriter, xsl, Zend OPcache, zip, zlib

# PHP Settings
max_execution_time - 3600
log_errors_max_len - 4096
max_file_uploads - 100
max_input_nesting_level - 64
max_input_time - 60
max_input_vars - 1000
memory_limit - 128M
post_max_size - 384M
sql.safe_mode - Off
upload_max_filesize - 256M
ldap.max_links - Unlimited
mysqli.max_links - Unlimited
mysqli.max_persistent - Unlimited
odbc.max_links - Unlimited
odbc.max_persistent - Unlimited
pcre.backtrack_limit - 1000000
pcre.recursion_limit - 100000
pgsql.max_links - Unlimited
pgsql.max_persistent - Unlimited
session.cache_limiter - no value
session.gc_maxlifetime - 7200
soap.wsdl_cache_limit - 5
opcache.max_accelerated_files - 4000
opcache.max_file_size - 0
opcache.max_wasted_percentage - 5

タグ:

Re: 外部フォーム処理後に、前のページに戻れないようにしたい

2020年8月17日 at 14:41
いつもお世話になっております。

先ほど質問をさせていただきましたが、コントローラ側に以下の
コードを追加することで回避できました。
ページの構成は、最初に入力用外部フォームが表示。
「確認する」ボタンをクリックして、回答内容の確認ページが
表示。確認ページには「回答ページへ戻る」と「回答を送信する」
ボタンを設置。
それぞれの<form>タグ内で、バリデーションヘルパのtokenを発行し、
それぞれ別の変数にoutput しました。
それをコントローラ側で処理する際、
コントローラ側のバリデーション処理で引っかかった場合、つまり
正規のフォームから発行されたトークンを受け取れなかった場合、

if ($validate != true){
die('不正な処理です。');
}

とすることで、前の画面へ戻れなくすることができました。
phpの二重送信対策でございました。基礎的なところで、大変
申し訳ございませんでした。
ありがとうございました。