1 xsrf设置
beego 有内建的 XSRF 的防范机制,在应用配置文件中加上
enablexsrf = true xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o xsrfexpire = 3600
或者直接在 main 入口处这样设置:
beego.EnableXSRF = true beego.XSRFKEY = "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o" // beego默认的xsrfkey是:“beegoxsrf”,这里将key改为基于当前的key进行加密 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()) }
2 在表单中使用
在 Controller 中这样设置数据:
func (this *HomeController) Get(){ this.Data["xsrfdata"]=template.HTML(this.XSRFFormHTML()) }
然后在模板中这样设置:
<form action="/new_message" method="post"> {{ .xsrfdata }} <input type="text" name="message"/> <input type="submit" value="Post"/> </form>
3 POST 请求处理
通过扩展 ajax 给每个请求加入 xsrf 的 header
4支持controller 级别的屏蔽
XSRF 之前是全局设置的一个参数,如果设置了那么所有的 API 请求都会进行验证,但是有些时候API 逻辑是不需要进行验证的,因此现在支持在controller 级别设置屏蔽:
type AdminController struct{ beego.Controller } func (a *AdminController) Prepare() { a.EnableXSRF = false }
参考文章:
https://www.xichangyou.com/819287.html
https://www.fansimao.com/819340.html
XSRF过滤 · Go语言中文文档