企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
当前防范 XSRF 的一种通用的方法,是对每一个用户都记录一个无法预知的 cookie 数据,然后要求所有提交的 请求(POST/PUT/DELETE)中都必须带有这个 cookie 数据。如果此数据不匹配 ,那么这个请求就可能是被伪 造的。 beego 有内建的 XSRF 的防范机制,要使用此机制,你需要在应用配置文件中加上 enablexsrf 设定: ``` enablexsrf = true xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o xsrfexpire = 3600 ``` 或者直接在 main 入口处这样设置: ``` 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()) } ``` 然后在模板中这样设置: ~~~ <form action="/student" method="post">       用户名:<input type="text" name="username"><br> {{ .xsrfdata }}       年龄:<input type="text" name="age"><br>       住址:<input type="text" name="addr"><br>       <input type="submit" value="提交"><br> ​ </form> ~~~ 后端获取数据并处理: ~~~ type StudentController struct {   beego.Controller } ​ func (s *StudentController) Get() {   s.TplName = "student.html"   s.Data["xsrfdata"]=template.HTML(s.XSRFFormHTML()) } ~~~ ~~~ type Student struct {   Id int `form:"-"`                       Name string `form:"username"`   Age int `form:"age"`   Addr string `form:"addr"` ​ } ​ func (s *StudentController) Post() {   student := Student{}             // 这里注意,变量名不能和结构体对象名不能相同   if err := s.ParseForm(&student); err != nil {       //handle error       return   }   fmt.Println(student)   fmt.Println(student.Name)   fmt.Println(student.Age)   fmt.Println(student.Addr)   s.TplName = "index.tpl" } ~~~ 注意: 结构体字段后面的为structTag,这里就是映射的form表单中的name参数,也就是form表单中的name字段对应结构体中的哪个字段