【问题标题】:Laravel check CSRF manually in controllerLaravel 在控制器中手动检查 CSRF
【发布时间】: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 并让节点转发它们(甚至不需要解析它们)就可以了。

标签: php node.js laravel socket.io


【解决方案1】:

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

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

这只是一个错字。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 2015-01-15
    • 2015-10-27
    • 2015-04-17
    • 1970-01-01
    • 2022-06-11
    • 2018-07-03
    • 2020-05-27
    • 2018-09-27
    相关资源
    最近更新 更多