Thanks to visit codestin.com
Credit goes to github.com

Skip to content

重新梳理 csrf #260

@dead-horse

Description

@dead-horse

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet#CSRF_Specific_Defense

业界主要的几种方案:

强 csrf token 校验

  • 实现方案:koa-csrf
  • 优点:强校验
  • 缺点:依赖服务端状态(session),ajax 使用不方便

Double Submit Cookie(ctoken)

  • 实现方案:ctoken
  • 优点:仅弱于强 csrf token 校验,不需要服务端状态。
  • 缺点:对 ajax 使用不够友好。

指定 header

egg 方案

综合考虑,强 csrf token 校验体验不好,指定 header 方案有漏洞,可以考虑全部基于 Double Submit Cookie 方案来实现。

  1. 所有的 POST, PUT, PATCH, DELETE 等 unsafe 的方法都必须要经过校验。
  2. form 表单:ctx.csrf 从 cookie 中取而不再从 session 中取 token,不再使用 csrf token,统一到 Double Submit Cookie 方案。
  3. 不再支持 isAjax 绕过。

文档

  1. 加强说明 Double Submit Cookie 的实现原理。
  2. 前端如何使用。
  • form 表单渲染时要渲染 ctoken。
  • ajax 请求需要带上请求头。
  • ajax 请求发现没有 ctoken 时,可以自己设置一个。
  1. 如何扩展到对同一个主域的 jsonp 请求进行防范。
exports.jsonpAPI = function*() {
  // 手动校验 ctoken,前提是同域有 cookie
  this.assertsCSRF();
  yield this.service.user.create(this.request.body);
  this.jsonp = { success: true };
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions