4.XSRF过滤
最后更新于:2022-04-02 04:54:07
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
~~~
~~~
Document
~~~
浏览器访问:
http://127.0.0.1:8080/admin/user/index
浏览器输出:
~~~
_xsrf : GpUbw6eo4KKOySAlJurxIIE3altPhxB5
你的输入:XSRF过滤
~~~
';