CSRF (跨域请求伪造) 中间件

CSRF (Cross-site request forgery) 跨域请求伪造,也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。[1]跨网站脚本 (XSS) 相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

用法

  1. e.Use(middleware.CSRF())

自定义配置

用法

  1. e := echo.New()
  2. e.Use(middleware.CSRFWithConfig(middleware.CSRFConfig{
  3. TokenLookup: "header:X-XSRF-TOKEN",
  4. }))

上面的例子使用 X-XSRF-TOKEN 请求头取出 CSRF 的 token 值。

获取 CSRF Token

服务器端

服务器端可以使用 ContextKeyEcho#Context 拿到 CSRF token 然后通过模版传给客户端。

客户端

客户端可以通过 CSRF cookie 拿到 token 值。

配置

  1. // CSRFConfig defines the config for CSRF middleware.
  2. CSRFConfig struct {
  3. // Skipper defines a function to skip middleware.
  4. Skipper Skipper
  5. // TokenLength is the length of the generated token.
  6. TokenLength uint8 `json:"token_length"`
  7. // Optional. Default value 32.
  8. // TokenLookup is a string in the form of "<source>:<key>" that is used
  9. // to extract token from the request.
  10. // Optional. Default value "header:X-CSRF-Token".
  11. // Possible values:
  12. // - "header:<name>"
  13. // - "form:<name>"
  14. // - "query:<name>"
  15. TokenLookup string `json:"token_lookup"`
  16. // Context key to store generated CSRF token into context.
  17. // Optional. Default value "csrf".
  18. ContextKey string `json:"context_key"`
  19. // Name of the CSRF cookie. This cookie will store CSRF token.
  20. // Optional. Default value "csrf".
  21. CookieName string `json:"cookie_name"`
  22. // Domain of the CSRF cookie.
  23. // Optional. Default value none.
  24. CookieDomain string `json:"cookie_domain"`
  25. // Path of the CSRF cookie.
  26. // Optional. Default value none.
  27. CookiePath string `json:"cookie_path"`
  28. // Max age (in seconds) of the CSRF cookie.
  29. // Optional. Default value 86400 (24hr).
  30. CookieMaxAge int `json:"cookie_max_age"`
  31. // Indicates if CSRF cookie is secure.
  32. // Optional. Default value false.
  33. CookieSecure bool `json:"cookie_secure"`
  34. // Indicates if CSRF cookie is HTTP only.
  35. // Optional. Default value false.
  36. CookieHTTPOnly bool `json:"cookie_http_only"`
  37. }

默认配置

  1. DefaultCSRFConfig = CSRFConfig{
  2. Skipper: defaultSkipper,
  3. TokenLength: 32,
  4. TokenLookup: "header:" + echo.HeaderXCSRFToken,
  5. ContextKey: "csrf",
  6. CookieName: "_csrf",
  7. CookieMaxAge: 86400,
  8. }