Go語言實戰 - revel框架教程之CSRF(跨站請求僞造)保護

CSRF是什麼?請看這篇博文「淺談CSRF攻擊方式」,說的很是清楚。html

如今作網站敢不防CSRF的我猜只有兩種狀況,一是沒什麼人訪問,二是局域網應用。山坡網以前屬於第一種狀況,哈哈,因此至今沒什麼問題。但昨天忽然發現了有人開始掃url,估計用的是個工具,很整齊的掃了一大片知名框架和數據庫管理工具的管理員登錄url。還好咱們沒有使用其中的任何一個,僥倖沒事。但這也給我敲響了警鐘,互聯網上那是危機重重啊。git

因而第一步就開始加上CSRF保護,搞起來仍是花費了些時間,暗歎這種事情仍是剛開始就作最容易。github

好,動手。數據庫

獲取revel-csrf包。框架

go get github.com/cbonello/revel-csrf函數

它是用revel的filter機制實現的,因此在controller包的init函數中給revel的默認filter鏈加上csrf處理。工具

revel.Filters = []revel.Filter{
  revel.PanicFilter,             
  revel.RouterFilter,            
  revel.FilterConfiguringFilter, 
  revel.ParamsFilter,            
  revel.SessionFilter,           
  revel.FlashFilter,             
  csrf.CSRFFilter,               // CSRF保護的filter
  revel.ValidationFilter,        
  revel.I18nFilter,             
  revel.InterceptorFilter,       
  revel.ActionInvoker,          
}測試

如今試試看除了GET以外的Request,應該會出現「403 Forbidden」錯誤,提示「CSRF token mismatch.」。起效了!網站

如今去修改view,在每個POST的Form上添加一個csrf token。url

<form class="form loginForm" action="/account/login" method="POST">
  <input type="hidden" name="csrf_token" value="{{ .csrf_token }}" />

</form>

再試試看,應該可已正常工做了。若是對應Ajax調用的話也是同理,在Request Data裏面加上一個名叫「csrf_token」的字段,值是 {{.csrf_token}}。

改動不大,但涉及的地方不少,前先後後修改加測試仍是花了一個小時。這事兒,必定要在剛開始的時候就考慮到,否則越到後期改起來越悲壯!

相關文章
相關標籤/搜索