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