文章出處

CSRF是什么?請看這篇博文“淺談CSRF攻擊方式”,說的非常清楚。

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

于是第一步就開始加上CSRF保護,搞起來還是花費了些時間,暗嘆這種事情還是剛開始就做最容易。

好,動手。

獲取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。

<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}}。

改動不大,但涉及的地方很多,前前后后修改加測試還是花了一個小時。這事兒,一定要在剛開始的時候就考慮到,不然越到后期改起來越悲壯!


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()