Laravel 5:强制使用csrf验证[GET]请求

时间:2015-07-24 09:29:39

标签: php security laravel laravel-5 csrf

默认情况下,Laravel 5验证&匹配所有[POST]请求的“令牌”,如何告诉L5验证“GET,PUT& Delete”请求?

- >阻止没有有效令牌的任何请求

感谢,

3 个答案:

答案 0 :(得分:3)

您可以创建自己的中间件来处理它并替换默认的Laravel VerifyCsrfToken类。在Laravel 5.3中:

  1. 创建新的中间件php artisan make:middleware VerifyCsrfTokenAll

  2. 替换app/Http/Kernel.php中的中间件类 - 搜索protected $middlewareGroups并用新的中间件替换VerifyCsrfToken::class。所以它看起来像这样:

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfTokenAll::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
        ...
    
  3. app/Http/Middleware/VerifyCsrfTokenAll.php中,使其扩展原始验证程序并覆盖isReading()方法,因为此方法负责绕过GET请求。这样的事情取决于你的用例:

    <?php
    namespace App\Http\Middleware;
    
    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
    
    class VerifyCsrfTokenAll extends BaseVerifier
    {
        /**
         * Determine if the HTTP request uses a ‘read’ verb.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return bool
         */
        protected function isReading($request)
        {
            return false;
            // return in_array($request->method(), ['HEAD', 'GET', 'OPTIONS']);
        }
    
    }
    
  4. 如果您只想验证某些路由,最好将其作为路由中间件,就像我的情况一样 - 我创建了一个VerifyCsrfTokenGet中间件并将其分配到app/Http/Kernel到{{ 1}}像这样的小组:

    $routeMiddleware

    protected $routeMiddleware = [ 'csrf_get' => \App\Http\Middleware\VerifyCsrfTokenGet::class, ... 我做了验证:

    app/Http/MIddleware/VerifyCsrfTokenGet.php

    并最终将此分配给任何路径作为public function handle($request, Closure $next) { // check matching token from GET $sessionToken = $request->session()->token(); $token = $request->input('_token'); if (! is_string($sessionToken) || ! is_string($token) || !hash_equals($sessionToken, $token) ) { throw new \Exception('CSRF token mismatch exception'); } return $next($request); } ,我想要验证它,例如。在一些控制器的构造函数中:

    csrf_middleware

答案 1 :(得分:0)

Laravel验证POST,PUT和DELETE的令牌。如果您遵循RESTful系统,则不需要为GET请求验证令牌。

来自文档:

  

您无需在POST,PUT或DELETE请求上手动验证CSRF令牌。 VerifyCsrfToken HTTP中间件将验证请求输入中的令牌是否与存储在会话中的令牌匹配。

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

答案 2 :(得分:0)

&#34; csrf token&#34;只是一个普通的会话值,其键名为&#34; _token&#34; ,您可以直接获取并重置此值。 像这样:

$token = $this->request->get('_token');
if(is_null($token) || $token!=csrf_token())
    throw new AppException('illegal_pay_operation');
else
    Session::regenerateToken();