beego如何作到XSRF防禦

跨站請求僞造(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 保護機制,這一點相當重要。

相關文章
相關標籤/搜索