当前防范 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字段对应结构体中的哪个字段
- go环境搭建
- 解决go get网络慢的问题
- beego的安装
- bee的安装
- 编辑器
- go module
- 配置文件详解
- 配置文件其他说明
- 路由方法
- 路由
- 数据校验
- 校验函数
- 页面跳转
- 获取前端数据
- json文件的获取
- xsrf的用法
- xsrf的防护
- srfs和json的搭配
- flash的用法
- 过滤器
- url反转
- 各类数据的处理
- 模板函数
- 内置模板函数
- 自定义模板函数
- 模板
- 模板处理
- 模板渲染
- 视图文件的处理
- 静态文件
- 请求方式判断
- 验证码
- 另一种方法
- 分页类
- session
- 登录判断
- orm模块
- 使用方法
- mysql的安装
- 安装orm及驱动
- 建立模型
- 自定义模型
- 增删改查
- 高级查询
- 常见问题汇总
- 代码收藏
- 打包部署
- go build打包
- utils收藏
- 新goer容易犯的错
- 字符串操作