XSRF过滤 跨站请求伪造 跨站请求伪造(Cross-site request forgery ),简称为XSRF,是Web应用中常见的一个安全问题。前面的链接也详细讲述了XSRF攻击的实现方式。 当前防范XSRF的一种通用的方法,是对每个用户都记录一个无法预知的cookie数据,然后要求所有提交的请求(POST / PUT / DELETE)中都必须带有这个cookie数据。如果此数据不匹配,那么这个请求就可能是被伪造的。 beego有内建的XSRF的防范机制,要使用此机制,您需要在应用配置文件中加上enablexsrf设定: enablexsrf = true xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o xsrfexpire = 3600 或者直接在主入口处这样的设置: beego.EnableXSRF = true beego.XSRFKEY = "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o" beego.XSRFExpire = 3600 //过期时间,默认1小时 如果开启了XSRF,那么beego的Web应用将对所有用户设置一个_xsrf的cookie值(默认过期1小时),如果POST PUT DELET请求中没有这个cookie值,那么这个请求会被直接拒绝。如果你开启了这个机制,那么在所有被提交的表单中,你都需要加上一个域来提供这个值。你可以通过在模板中使用专门的函数XSRFFormHTML()来做到这一点: 过期时间上面我们设置了全局的过期时间beego.XSRFExpire,但是有些时候我们也可以在控制器中修改这个过期时间,专门针对某一类处理逻辑: func (this *HomeController) Get(){ this.XSRFExpire = 7200 this.Data["xsrfdata"]=template.HTML(this.XSRFFormHTML()) } 在表单中使用 ~~~ |-- conf | `-- app.conf ~~~ ~~~ appname = project httpport = 8080 runmode = dev enablexsrf = true xsrfkey = lalalalallalalallalalallallalla xsrfexpire = 3600 ~~~ ~~~ |-- admin | |--controllers | `-- user.go ~~~ ~~~ package admin import ( "fmt" "html/template" "github.com/astaxie/beego" ) type UserController struct { beego.Controller } func (this *UserController) Index() { if this.Ctx.Request.Method == "GET" { this.XSRFExpire = 7200 this.Data["xsrfdata"] = template.HTML(this.XSRFFormHTML()) this.TplName = "admin/user/index.html" } else { _xsrf := this.GetString("_xsrf") xsrf := this.GetString("xsrf") this.Ctx.WriteString(fmt.Sprintf("_xsrf : %v\n 你的输入:%v\n", _xsrf, xsrf)) } } ~~~ ~~~ |-- views | |--admin | |--user | `-- index.html ~~~ ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <form action='{{urlfor "UserController.Add"}}' method="post" enctype="multipart/form-data"> {{ .xsrfdata }} <div class="field-content"> XSRF过滤:<input name="xsrf" type="text" /> </div> <div class="field-content"> <input type="submit" value="提交" /> </div> </form> </body> </html> ~~~ 浏览器访问: http://127.0.0.1:8080/admin/user/index 浏览器输出: ~~~ _xsrf : GpUbw6eo4KKOySAlJurxIIE3altPhxB5 你的输入:XSRF过滤 ~~~