默认情况下,Laravel 5验证&匹配所有[POST]请求的“令牌”,如何告诉L5验证“GET,PUT& Delete”请求?
- >阻止没有有效令牌的任何请求
感谢,
答案 0 :(得分:3)
您可以创建自己的中间件来处理它并替换默认的Laravel VerifyCsrfToken类。在Laravel 5.3中:
创建新的中间件php artisan make:middleware VerifyCsrfTokenAll
替换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,
],
...
在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']);
}
}
如果您只想验证某些路由,最好将其作为路由中间件,就像我的情况一样 - 我创建了一个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中间件将验证请求输入中的令牌是否与存储在会话中的令牌匹配。
答案 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();