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,
}
|