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 令牌不匹配异常