CSRF是什么?請看這篇博文“淺談CSRF攻擊方式”,說的非常清楚。
現在做網站敢不防CSRF的我猜只有兩種情況,一是沒什么人訪問,二是局域網應用。山坡網之前屬于第一種情況,哈哈,所以至今沒什么問題。但昨天突然發現了有人開始掃url,估計用的是個工具,很整齊的掃了一大片知名框架和數據庫管理工具的管理員登陸url。還好我們沒有使用其中的任何一個,僥幸沒事。但這也給我敲響了警鐘,互聯網上那是危機重重啊。
于是第一步就開始加上CSRF保護,搞起來還是花費了些時間,暗嘆這種事情還是剛開始就做最容易。
好,動手。
獲取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}}。
改動不大,但涉及的地方很多,前前后后修改加測試還是花了一個小時。這事兒,一定要在剛開始的時候就考慮到,不然越到后期改起來越悲壯!
文章列表