-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Closed
eggjs/security
#10Description
业界主要的几种方案:
强 csrf token 校验
- 实现方案:koa-csrf
- 优点:强校验
- 缺点:依赖服务端状态(session),ajax 使用不方便
Double Submit Cookie(ctoken)
- 实现方案:ctoken
- 优点:仅弱于强 csrf token 校验,不需要服务端状态。
- 缺点:对 ajax 使用不够友好。
指定 header
- 实现方案:保留现在的 ctx.isAjax 判断。
- 优点:对 ajax 使用最方便。
- 缺点:会被绕过,django 和 rails 都已经废弃了此种方案https://www.djangoproject.com/weblog/2011/feb/08/security/
egg 方案
综合考虑,强 csrf token 校验体验不好,指定 header 方案有漏洞,可以考虑全部基于 Double Submit Cookie 方案来实现。
- 所有的 POST, PUT, PATCH, DELETE 等 unsafe 的方法都必须要经过校验。
- form 表单:
ctx.csrf从 cookie 中取而不再从 session 中取 token,不再使用 csrf token,统一到 Double Submit Cookie 方案。 - 不再支持
isAjax绕过。
文档
- 加强说明 Double Submit Cookie 的实现原理。
- 前端如何使用。
- form 表单渲染时要渲染 ctoken。
- ajax 请求需要带上请求头。
- ajax 请求发现没有 ctoken 时,可以自己设置一个。
- 如何扩展到对同一个主域的 jsonp 请求进行防范。
exports.jsonpAPI = function*() {
// 手动校验 ctoken,前提是同域有 cookie
this.assertsCSRF();
yield this.service.user.create(this.request.body);
this.jsonp = { success: true };
}