環境
cakephp ver3.7.5
PHP 7.1.24
下記のページを参考にお問い合わせフォームを作成しております。
Cake3でお問い合わせフォームを作成する方法(DBを使わない)
https://qiita.com/kozo/items/00e66e8d0c3dbbfc907c
送信完了までのフローはできたのですが、完了後にページのリロードを行うと再度送信出来てしまうのが気持ち悪く何かcakephp3の機能をそのまま使い対策できないかと思っております。
参考:Cookbook クロスサイトリクエストフォージェリー (CSRF) ミドルウェア
https://book.cakephp.org/3.0/ja/controllers/middleware.html#csrf
フレームワーク自体にcsrfの機能があるので、それが有効になっていればリロードによる2重投稿を防げるものだと思っていたのですが間違った認識なのでしょうか?
php
1Router::scope('/', function (RouteBuilder $routes) { 2 // Register scoped middleware for in scopes. 3 $routes->registerMiddleware('csrf', new CsrfProtectionMiddleware([ 4 'httpOnly' => true 5 ]));
デフォルトでroute.phpにもcsrfの記述があり、またFormheperを使用してフォームの記述を行っているので
htmlのソースの方には自動でhiddenのtokenが出力されている状態です。
html
1<input type="hidden" name="_csrfToken" autocomplete="off" value="文字列"/>
コントローラー
php
1<?php 2 3namespace App\Controller; 4 5use App\Form\ContactForm; 6 7class ContactsController extends AppController 8{ 9 public function index() 10 { 11 $contact = new ContactForm(); 12 13 if ($this->request->is('post')) { 14 if ($contact->execute($contact->execute($this->request->getData())) { 15 $this->Flash->success('メール送信しました'); 16 } else { 17 $this->Flash->error('バリデーションに引っかかりました。'); 18 } 19 } 20 21 $this->set('contact', $contact); 22 } 23}
お手数ですがアドバイスいただけると幸いです。