LoginSignup
4
7

More than 3 years have passed since last update.

PHP【Laravel】:POSTの設定とCSRF対策について

Last updated at Posted at 2020-04-05

PHPのフレームワークLaravelでPOSTを使い値を送信する際の注意点について学んだのでメモ。

POSTを使うなんてプログラミングを学び始めの頃、見よう見まねでできたのに、何今頃つまずいているんだと凹みながら色々調べていたら、Laravelでは少し勝手が違うようだった。

まず、以下のコードを書きを実行したら、「419のHTTPステータスエラー」が出た。

ビュー

sample.blade.php 
<h1>タイトル</h1>
      <p class="name">ようこそ{{$msg}}さん</p>

  <form method="POST" action="/sample">
     名前を入力してください<br>
    <input type="text" name="msg">
    <input type="submit">
  </form>

ルーティング

web.php
Route::get('/sample', 'SampleController@test');
Route::post('/sample', 'SampleController@test');

コントローラ

SampleController.php
class SampleController extends Controller
{
  public function test(Request $request){

    $data['msg'] = $request->msg;

    return view('sample.sample', $data);
    //
  }

原因はCSRFトークン:

原因はCSRFトークンでした。
Laravelでは、クロスサイトリクエストフォージェリ対策として、CSRFトークンを使用することができます。

CSRFについて

Laravelではミドルウェアにデフォルトで

kernel.php
 \App\Http\Middleware\VerifyCsrfToken::class

という記載があります。

kernel.php
protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

なのでCSRF対策の仕組みを実際に使う必要があります。

修正

ビューに@csrfを追記。

sample.blade.php
<h1>タイトル</h1>
      <p class="name">ようこそ{{$msg}}さん</p>

  <form method="POST" action="/sample">
    @csrf
     名前を入力してください<br>
    <input type="text" name="msg">
    <input type="submit">
  </form>

もしくは、ミドルウェアで無効化(コメントアウト)。

kernel.php
protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,

           // \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7