其实官网的介绍已经很详细了https://beego.me/docs/mvc/controller/xsrf.md, 我这里自己做一个demo来演练一下
srf(跨站请求伪造)防护:
- 定义:每个用户一个cookie,所有的请求都需要验证这个cookie,如果没有这个cookie,则被认为跨站请求伪造。
- 防止类型:挟制用户在当前已登陆的web应用程序上执行非本意的操作的攻击方法。
- XSRF:利用的是网站对用户网页浏览器的信任。
一、开启XSRF防护的两种方法
// 在配置文件里添加如下三条配置 enablexsrf = true // 开启xsrf防护 xsrfkey = 61oEzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o // beego默认的xsrfkey是:“beegoxsrf”,这里将key改为基于当前的key进行加密 xsrfexpire = 3600 //过期时间,默认1小时,单位秒
1.2、方法二:在main.go里beego.Run()上方开启
// 在beego.Run()上方添加如下三行配置 beego.BConfig.WebConfig.EnableXSRF = true // 开启xsrf防护 beego.BConfig.WebConfig.XSRFKey = "61oEzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o" // beego默认的xsrfkey是:“beegoxsrf”,这里将key改为基于当前的key进行加密 beego.BConfig.WebConfig.XSRFExpire = 3600 //过期时间,默认1小时,单位秒
二、开启XSRF防护后使用post请求提交数据示例
xsrf只对post请求生效,对get请求无效,本示例是基于form表单的xsrf防护示例:
controller定义
-
package controllers import ( "html/template" "github.com/astaxie/beego" ) type MainController struct { beego.Controller } func (c *MainController) Get() { c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML()) c.TplName = "index.tpl" } func (c *MainController) Post() { c.TplName = "success.html" }
2.3、模板文件中form表单使用xsrf防护
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>test xsrf 页面</h1> <!-- form表单使用xsrf防护, 提交时不需要做特殊处理,只需要在form标签里获取后端传过来的xsrf key即可 --> <form action="/" method="POST"> {{.xsrfdata}} <!-- 获取get请求时后端传过来的xsrf防护的key --> <input type="submit" value="提交"> </form> </body> </html>
查看网页代码
发现提交页面里自动生成了一个 name=“_xsrf” 的input标签。
三、如何取消某一个controller的xsrf防护
开启xsrf防护后全局的controller就都开启了xsrf防护了,但是有个特殊的需求需要对某一个controller关闭xsrd防护该如何做那?
我们只需要对需要关闭xsrf防护的controller实现一个 ”Prepare“ 方法即可,方法的内容如下:
// Prepare 方法 func (c *XsrfController) Prepare() { c.EnableXSRF = false // 关闭xsrf防护 }