Laravel 5:POST无需CSRF检查

iga*_*ter 6 csrf laravel-5

默认情况下,Laravel 5似乎将CSRF过滤器应用于所有非获取请求.这对于表单POST是可以的,但对于POST DELETE等的API可能是个问题.

简单问题:

如何设置没有CSRF保护的POST路由?

小智 12

转到app/Http/Middleware/VerifyCsrfToken.php然后在$ except数组中输入您的路由(您要为其禁用csrf令牌).

例如:

class VerifyCsrfToken extends BaseVerifier
{

    protected $except = [

        '/register'

    ];
}
Run Code Online (Sandbox Code Playgroud)


msh*_*eel 5

您可以通过简单地将它们添加到中间件的$except属性VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)来从CSRF中排除URI :

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'api/*',
    ];
}
Run Code Online (Sandbox Code Playgroud)

文档:http://laravel.com/docs/5.1/routing#csrf-protection


iga*_*ter 2

我对这个问题的破解:

CSRF现在是一个在全球注册的“中间件” App\Http\Kernel.php。删除它将默认没有 CSRF 保护(Laravel4 行为)。

要在路线中启用它:

  1. 在您的 app/Providers/RouteServiceProvider.php 中创建一个简写密钥:

    protected $middleware = [
      // ....
      'csrf'  => 'Illuminate\Foundation\Http\Middleware\VerifyCsrfToken',
    ];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您现在可以将其启用到任何路由:

    $router->post('url', ['middleware' => 'csrf', function() {
     ... 
    }]);
    
    Run Code Online (Sandbox Code Playgroud)

在我看来,这不是最优雅的解决方案......