PHP

Laravelの二重送信対策

動作環境

  • Laravel 8.40.0
  • PHP 8.0.3
  • macOS 12.0.1
  • CentOS Linux release 7.8.2003 (Core)でも検証済み

登録フォームなどで意図しないリクエストにより複数回フォームが送信され重複したデータが保存される場合があります。

その対策方法をまとめます。

重複したリクエストが発生するケースとして以下のケースが考えられるかと思います。

二重送信となるケース

  • フォームのサブミットボタンをダブルクリックする
  • フォーム送信後、戻るボタンでフォームに戻り再度サブミットボタンをクリックする
  • フォーム送信後の完了ページでリロードする

対策方法

コントローラーのstoreメソッドなどのpostデータがデータベースに保存される際に以下のコードを記載する。

$request->session()->regenerateToken();

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Answer;

class AnswersController extends Controller
{
    public function store(Request $request)
    {
        $answer = new Answer();
        $answer->answer = $request->answer;
        $answer->save();

        // 二重送信防止
        $request->session()->regenerateToken();

        return view('answers/success');
    }
}

この対策を行うと、二重送信がされた際には419エラーが返され、データの重複登録などが発生しないようになります。

  • この記事を書いた人

コウダイ

都内のWeb系自社開発企業に勤務するエンジニア|33歳1児のパパ|ブログ歴4年→月間6,000PV|新卒で手取り18万のホテルマン6年→プログラミングを900時間勉強→100社以上応募しアラサー未経験から7ヶ月でフルリモートのWEB系自社開発エンジニアに転職し年収100万円UP|【人生を自由に、ノンストレスで生きる】をテーマに、30歳で文系・異業種未経験からITエンジニアに転職したノウハウの他、プログラミングやブログで稼ぐ方法など、「時間や場所に縛られずに稼ぐ」方法を発信しています。

-PHP