首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 5:强制使用csrf验证[GET]请求

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

Stack Overflow用户
提问于 2015-07-24 09:29:39
回答 3查看 7.6K关注 0票数 1

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

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

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-24 09:35:29

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

从文件中:

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

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

票数 -1
EN

Stack Overflow用户

发布于 2017-01-14 23:56:57

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

  1. 创建新的中间件php artisan make:middleware VerifyCsrfTokenAll
  2. 替换app/Http/Kernel.php中的中间件类-搜索protected $middlewareGroups并用新的中间件替换VerifyCsrfToken::class。所以看起来是这样的: 受保护的\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,$middlewareGroups =[ 'web‘=> \App\Http\中间件\EncryptCookies::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请求。这种情况取决于您的用例:

如果您只想在某些路由上进行验证,最好将其作为路由中间件(在我的情况下)--我创建了一个VerifyCsrfTokenGet中间件,并在app/Http/Kernel中将它分配给了$routeMiddleware组,如下所示:

代码语言:javascript
运行
复制
protected $routeMiddleware = [
    'csrf_get' => \App\Http\Middleware\VerifyCsrfTokenGet::class,
    ...

app/Http/MIddleware/VerifyCsrfTokenGet.php中,我进行了验证:

代码语言:javascript
运行
复制
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分配给任何我想要验证的路由,例如。在某些控制器的构造函数中:

代码语言:javascript
运行
复制
class InvoicesController extends Controller
{
    function __construct()
    {
        // define middleware
        $this->middleware('csrf_get', ['only' => ['pay', 'createmail']]);
    }
票数 4
EN

Stack Overflow用户

发布于 2018-04-11 10:45:14

"csrf令牌“只是一个键名为"_token”的普通会话值,您可以直接获取和重置这个值。就像这样:

代码语言:javascript
运行
复制
$token = $this->request->get('_token');
if(is_null($token) || $token!=csrf_token())
    throw new AppException('illegal_pay_operation');
else
    Session::regenerateToken();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31606926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档