介绍

本文介绍如何通过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”。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐