业界主要的几种方案:
综合考虑,强 csrf token 校验体验不好,指定 header 方案有漏洞,可以考虑全部基于 Double Submit Cookie 方案来实现。
ctx.csrf 从 cookie 中取而不再从 session 中取 token,不再使用 csrf token,统一到 Double Submit Cookie 方案。isAjax 绕过。exports.jsonpAPI = function*() {
// 手动校验 ctoken,前提是同域有 cookie
this.assertsCSRF();
yield this.service.user.create(this.request.body);
this.jsonp = { success: true };
}
为什么对 ajax 请求也需要校验 csrf:
再提一个技术方案 https://jwt.io/ 通过约定header的
好处:
jwt 和 ctoken 方案本质上类似吧,只是多了一层加密和校验,用来做 csrf 防范太重了
方案不一样,是走header的不走cookie,确实比较重,不过是有标准和规范的, 认同先使用ctoken做ajax防范
form 必须走 csrf 才能防住吧,form 走 ctoken 是防不住的。
明白了,form 也得提交 ctoken,然后跟 cookie 的 ctoken 校验。
那么就统一了,必须先渲染一次页面,种上 ctoken。
+1
把这个搞定应该可以发 1.0 了
https://scotthelme.co.uk/csrf-is-dead/ 今天看到这个,还是很应景的
samesite cookie我看最近死马的pr有出现过
之前刚接触egg的时候,提交表单好像就要验证cookie,然后表单中还要有一个隐藏域存放csrf值的,但是今天突然发现,好像没有了这个,是不是默认关闭了啊?
@lzq920 依旧需要,可以看文档确认一下策略。 https://eggjs.org/zh-cn/core/security.html#安全威胁-csrf-的防范
Most helpful comment
方案不一样,是走header的不走cookie,确实比较重,不过是有标准和规范的, 认同先使用ctoken做ajax防范