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

改动不大,但涉及的地方不少,前先后后修改加测试仍是花了一个小时。这事儿,必定要在刚开始的时候就考虑到,否则越到后期改起来越悲壮!

相关文章
相关标签/搜索