跨站請求僞造(Cross-site request forgery), 簡稱爲 XSRF,是 Web 應用中常見的一個安全問題。前面的連接也詳細講述了 XSRF 攻擊的實現方式。 ajax
當前防範 XSRF 的一種通用的方法,是對每個用戶都記錄一個沒法預知的 cookie 數據,而後要求全部提交的請求(POST/PUT/DELETE)中都必須帶有這個 cookie 數據。若是此數據不匹配 ,那麼這個請求就多是被僞造的。 安全
Beego 有內建的 XSRF 的防範機制,要使用此機制,你須要在應用配置文件中加上 enablexsrf 設定: cookie
enablexsrf = true xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o xsrfexpire = 3600
或者直接在 main 入口處這樣設置: 函數
beego.EnableXSRF = true beego.XSRFKEY = "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o" beego.XSRFExpire = 3600 //過時時間,默認60秒
若是開啓了 XSRF,那麼 Beego 的 Web 應用將對全部用戶設置一個 _xsrf 的 cookie 值(默認過時 60 秒),若是 POST PUT DELET 請求中沒有這個 cookie 值,那麼這個請求會被直接拒絕。若是你開啓了這個機制,那麼在全部被提交的表單中,你都須要加上一個域來提供這個值。你能夠經過在模板中使用 專門的函數 XsrfFormHtml() 來作到這一點: post
過時時間上面咱們設置了全局的過去時間 beego.XSRFExpire,可是有些時候咱們也能夠在控制器中修改這個過時時間,專門針對某一類處理邏輯: this
func (this *HomeController) Get(){ this.XSRFExpire = 7200 this.data["xsrfdata"]=template.HTML(this.XsrfFormHtml()) }
在 Controller 中這樣設置數據: url
func (this *HomeController) Get(){ this.data["xsrfdata"]=template.HTML(this.XsrfFormHtml()) }
而後在模板中這樣設置: spa
<form action="/new_message" method="post"> {{ .xsrfdata }} <input type="text" name="message"> <input type="submit" value="Post"> </form>
若是你提交的是 AJAX 的 POST 請求,你仍是須要在每個請求中經過腳本添加上 _xsrf 這個值。下面是在 AJAX 的 POST 請求,使用了 jQuery 函數來爲全部請求組東添加 _xsrf 值: code
function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined; } jQuery.postJSON = function(url, args, callback) { args._xsrf = getCookie("_xsrf"); $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST", success: function(response) { callback(eval("(" + response + ")")); }}); };
對於 PUT 和 DELETE 請求(以及不使用將 form 內容做爲參數的 POST 請求)來講,你也能夠在 HTTP 頭中以 X-XSRFToken 這個參數傳遞 XSRF token。 orm
若是你須要針對每個請求處理器定製 XSRF 行爲,你能夠重寫 Controller 的 CheckXsrfCookie 方法。例如你須要使用一個不支持 cookie 的 API, 你能夠經過將 CheckXsrfCookie() 函數設空來禁用 XSRF 保護機制。然而若是 你須要同時支持 cookie 和非 cookie 認證方式,那麼只要當前請求是經過 cookie 進行認證的,你就應該對其使用 XSRF 保護機制,這一點相當重要。