CSRF

CSRF - 跨站请求伪造

原文:https://echo.labstack.com/docs/middleware/csrf

​ 跨站请求伪造(Cross-site request forgery),也称为一次点击攻击(one-click attack)、会话劫持(session riding),缩写为 CSRF(有时发音为 sea-surf)或 XSRF,是一种对网站的恶意利用(malicious exploit)方式,通过该方式,未经授权的命令可以从被网站信任的用户那里传输。

Usage

1
e.Use(middleware.CSRF())

Custom Configuration

Usage

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

​ 以上示例使用 X-XSRF-TOKEN 请求头来提取 CSRF 令牌。

从 Cookie 中读取令牌的示例配置

1
2
3
4
5
6
7
8
middleware.CSRFWithConfig(middleware.CSRFConfig{
    TokenLookup:    "cookie:_csrf",
    CookiePath:     "/",
    CookieDomain:   "example.com",
    CookieSecure:   true,
    CookieHTTPOnly: true,
    CookieSameSite: http.SameSiteStrictMode,
})

访问 CSRF 令牌

服务端

​ 可以通过 Echo#Context 使用 ContextKey 来访问 CSRF 令牌,并通过模板传递给客户端。

客户端

​ 可以通过 CSRF cookie 来访问 CSRF 令牌。

Configuration

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
CSRFConfig struct {
  // Skipper 定义一个用于跳过中间件的函数。
  Skipper Skipper

  // TokenLength 是生成的令牌的长度。
  TokenLength uint8 `json:"token_length"`
  // 可选。默认值 32

  // TokenLookup 是一个字符串,格式为 "<source>:<key>",
  // 用于从请求中提取令牌。
  // 可选。默认值 "header:X-CSRF-Token"。
  // 可能的取值:
  // - "header:<name>"
  // - "form:<name>"
  // - "query:<name>"
  // - "cookie:<name>"
  TokenLookup string `json:"token_lookup"`

  // Context key to store generated CSRF token into context.
  // Optional. Default value "csrf".
  // 用于将生成的 CSRF 令牌存储到context中的Context键。
  // 可选。默认值 "csrf"。 
  ContextKey string `json:"context_key"`

  // CSRF cookie 的名称。该 cookie 用于存储 CSRF 令牌。
  // 可选。默认值 "_csrf"。
  CookieName string `json:"cookie_name"`

  // CSRF Cookie 的域。
  // 可选。默认值 none。
  CookieDomain string `json:"cookie_domain"`

  // CSRF cookie 的路径。
  // 可选。默认值 none。
  CookiePath string `json:"cookie_path"`

  // CSRF cookie 的最大有效期(以秒为单位)。
  // 可选。默认值 86400(24小时)。
  CookieMaxAge int `json:"cookie_max_age"`

  // 指示 CSRF cookie 是否为安全的。
  // 可选。默认值 false。
  CookieSecure bool `json:"cookie_secure"`

  // 指示 CSRF cookie 是否为 HTTP Only。
  // 可选。默认值 false。
  CookieHTTPOnly bool `json:"cookie_http_only"`
}

Default Configuration

1
2
3
4
5
6
7
8
DefaultCSRFConfig = CSRFConfig{
  Skipper:      DefaultSkipper,
  TokenLength:  32,
  TokenLookup:  "header:" + echo.HeaderXCSRFToken,
  ContextKey:   "csrf",
  CookieName:   "_csrf",
  CookieMaxAge: 86400,
}
最后修改 October 10, 2024: 更新 (a4b8f85)