當前防范 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容易犯的錯
- 字符串操作