Gin安全篇-3:快速实现CSRF验证
介绍
本文介绍如何通过rk-boot实现服务器的 CSRF 验证逻辑。
什么是 CSRF?
跨站请求伪造(英文:Cross Site Request Forgery),又称一键攻击或会话骑乘,通常缩写为CSRF或XSRF,是一种强制用户对当前登录的Web应用程序进行无意识操作的攻击手段。
与跨站脚本(XSS)相比,XSS 使用的是用户对指定网站的信任,而 CSRF 使用的是网站对用户浏览器的信任。

**什么
防御是什么?
有几种流行的防御方法。我们通过实例来实现对[添加验证Token]的防御。
1:Token同步方式 2:查看Referer字段 3:添加验证Token
完整教程请访问以下地址:
- https://rkdocs.netlify.app/cn
安装
去 github.com/rookie-ninja/rk-boot/gin
快速入门
1.创建启动 yaml
开机。 yaml 文件告诉 rk boot 如何启动 Gin 服务。
在下面的 YAML 文件中,我们声明了一件事:
- 开启CSRF拦截器,使用默认参数。拦截器会检查请求Header中X-CSRF-Token的值来判断Token是否正确。
---
杜松子酒:
- name: greeter # 必填
端口:8080 # 必填
enabled: true # 必需
拦截器:
csrf:
enabled: true # 可选,默认:false
2.创建主程序
我们为 Gin 添加了两个 RESTful API。
-
GET /v1/greeter:返回服务器生成的CSRF Token
-
POST /v1/greeter: 验证 CSRF Token
// 版权所有 (c) 2021 菜鸟忍者
//
// 此源代码的使用由 Apache 风格管理
// 可以在 LICENSE 文件中找到的许可证。
包主
进口(
“上下文”
“github.com/gin-gonic/gin”
“github.com/rookie-ninja/rk-boot”
“github.com/rookie-ninja/rk-boot/gin”
“网络/http”
)
// 应用入口。
功能主() {
// 创建一个新的启动实例。
引导 :u003d rkboot.NewBoot()
ginEntry :u003d rkbootgin.GetGinEntry("greeter")
// 注册 /v1/greeter GET
ginEntry.Router.GET("/v1/greeter", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK,“你好!”)
})
// 注册 /v1/greeter POST
ginEntry.Router.POST("/v1/greeter", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK,“你好!”)
})
// 引导
boot.Bootstrap(context.Background())
// 等待关机信号
boot.WaitForShutdownSig(context.Background())
}
3.文件夹结构
。
├── boot.yaml
├── go.mod
├── go.sum
└── main.go
0 个目录,4 个文件
- go.mod
模块 github.com/rookie-ninja/rk-demo
去 1.16
要求 (
github.com/rookie-ninja/rk-boot v1.4.0
github.com/rookie-ninja/rk-boot/gin v1.2.12
)
4.确认
- 向 /v1/greeter 发送 GET 请求,我们将 GET CSRF Token。
$ curl -X GET -vs localhost:8080/v1/greeter
...
< HTTP/1.1 200 正常
< 内容类型:应用程序/json;字符集u003dutf-8
< 设置 Cookie:_csrfu003dXVlBzgbaiCMRAjWwhTHctcuAxhxKQFDa;到期u003d格林威治标准时间 2021 年 12 月 27 日星期一 09:35:20
< 变化:饼干
< 日期:2021 年 12 月 26 日星期日 09:35:20 GMT
< 内容长度:8
<
* 到主机 localhost 的连接 #0 保持不变
“你好!”*
- 向 /v1/greeter 发送 POST 请求,并提供合法的 CSRF Token。
$ curl -X POST -v --cookie "_csrfu003dmy-test-csrf-token" -H "X-CSRF-Token:my-test-csrf-token" localhost:8080/v1/greeter
...
Cookie:_csrfu003dmy-test-csrf-token
X-CSRF-Token:my-test-csrf-token
< HTTP/1.1 200 正常
< 内容类型:应用程序/json;字符集u003dutf-8
< 设置 Cookie:_csrfu003dmy-test-csrf-token;过期u003d2021 年 12 月 27 日星期一 09:35:43 GMT
< 变化:饼干
< 日期:2021 年 12 月 26 日星期日 09:35:43 GMT
< 内容长度:8
<
* 到主机 localhost 的连接 #0 保持不变
“你好!”*
- 向 /v1/greeter 发送 POST 请求,并提供非法的 CSRF Token。
$ curl -X POST -v -H "X-CSRF-Token:my-test-csrf-token" localhost:8080/v1/greeter
...
X-CSRF-Token:my-test-csrf-token
< HTTP/1.1 403 禁止
< 内容类型:应用程序/json;字符集u003dutf-8
< 日期:2021 年 12 月 26 日星期日 09:36:18 GMT
< 内容长度:91
<
* 到主机 localhost 的连接 #0 保持不变
{"error":{"code":403,"status":"Forbidden","message":"invalid csrf token","details":[null]}}
CSRF拦截器选项
Rk boot 提供了几个 CSRF 拦截器选项。除非有特殊需要,否则不建议使用 override 选项。
选项
描述
类型
默认值
gin.interceptors.csrf.enabled
启动 CSRF 拦截器
布尔值
错误的
gin.interceptors.csrf.token 长度
令牌长度
整数
32
gin.interceptors.csrf.tokenLookup
Token获取方式请参考下方介绍
细绳
“标头:X-CSRF-令牌”
gin.interceptors.csrf.cookieName
饼干名称
细绳
_csrf
gin.interceptors.csrf.cookieDomain
Cookie 域
细绳
“”
gin.interceptors.csrf.cookiePath
饼干路径
细绳
“”
gin.interceptors.csrf.cookieMaxAge
Cookie MaxAge(秒)
整数
86400(24小时)
gin.interceptors.csrf.cookieHttpOnly
Cookie HTTP Only 选项
布尔
错误的
gin.interceptors.csrf.cookieSameSite
Cookie SameSite 选项,支持 lax、strict、none 和 default
细绳
“松懈”
gin.interceptors.csrf.ignorePrefix
忽略用于 CSRF 验证的 Restful API 路径
[]细绳
[]
token查找格式
目前支持以下三种方式。拦截器将使用以下方法之一在请求中查找 Token。
-
从 HTTP Header 中获取
-
从 HTTP 表单获取
-
从 HTTP 查询中获取
// 可选。默认值“标头:X-CSRF-Token”。
// 可能的值:
// - “标题:<名称>”
// - “表格:<名称>”
// - “查询:<名称>”
// 可选。默认值“标头:X-CSRF-Token”。
更多推荐
所有评论(0)