Laravel 在控制器中手动检查 CSRF

Posted

技术标签:

【中文标题】Laravel 在控制器中手动检查 CSRF【英文标题】:Laravel check CSRF manually in controller 【发布时间】:2018-03-19 14:35:15 【问题描述】:

我正在使用 Laravel 5.5。当我从 laravel 刀片发送 POST 请求时。然后一切正常:

$.post(
    url: 'http://localhost/check',
    data: 
        _token: CSRF_TOKEN,  // I have CSRF token variable above.
        test: "it works"
    
)

但我想用 socket.io > node.js > laravel 发送那个请求:

socket.emit('checkPost',  token: CSRF_TOKEN );

index.js

socket.on('checkPost', function (csrf) 
    request.post(
        url: 'http://localhost/check',
        form: 
            _token: csrf.token,
            test: "it works"
        
    );
);

使用 ajax 一切正常。在这里,我得到了令牌不匹配。为什么?

当我在 VerifyCsrfToken 中为 /check 路由禁用令牌验证时,节点请求也可以工作。

我该如何解决这个问题?也许有控制器 csrf 检查方法?然后我会检查控制器中的 csrf 帖子。在此先感谢并为我的英语不好感到抱歉。

【问题讨论】:

node.js 是否也转发 cookie? @apokryfos 不,我想我明白了。在节点中没有来自 laravel 的任何会话是的? 问题是Laravel通过读取用户发送的会话cookie来加载会话。如果请求直接通过 post 发送,则 cookie 会正确发送,但如果它们通过套接字发送到 node.js,则可能根本不会发送 cookie。因此,从 node.js 到 laravel 的请求似乎每次都是来自新用户的新请求。 npmjs.com/package/cookie 使用套接字发送 cookie 会话是个好主意吗? 通过套接字对用户进行身份验证的正确方法可能是基于令牌的方法,如 oauth 或 jwt。但对于简单的用例来说,这些可能有点矫枉过正。如果这是一个简单的用例,那么只需发送 cookie 并让节点转发它们(甚至不需要解析它们)就可以了。 【参考方案1】:

您错过了标记变量名称前的下划线。 Laravel 的令牌输入名称是“_token”而不是“token”。你必须这样写:

socket.emit('checkPost',  _token: CSRF_TOKEN );

这只是一个错字。

希望这会有所帮助。

【讨论】:

以上是关于Laravel 在控制器中手动检查 CSRF的主要内容,如果未能解决你的问题,请参考以下文章

身份验证控制器中的 Laravel 5.2 Web 中间件导致 csrf 令牌不匹配

Laravel - 将 VerifyCsrfToken 添加到控制器获取 ajax 请求

本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常

Rails - 不检查 CSRF 令牌的控制器

markdown [Laravel]如何修复控制台上找不到的CSRF令牌

当通过Ajax进行POST时,Laravel 5.6 CSRF令牌失败