好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Go语言实战 - revel框架教程之CSRF(跨站请求伪造)

CSRF是什么?请看这篇博文[ 浅谈CSRF攻击方式 ],说的非常清楚。

现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用。山坡网之前属于第一种情况,哈哈,所以至今没什么问题。但昨天突然发现了有人开始扫url,估计用的是个工具,很整齐的扫了一大片知名框架和 数据库 管理工具的管理员登陆url。还好我们没有使用其中的任何一个,侥幸没事。但这也给我敲响了警钟,互联网上那是危机重重啊。

 

于是第一步就开始加上CSRF保护,搞起来还是花费了些时间,暗叹这种事情还是刚开始就做最容易。

 

好,动手。

 

获取revel-csrf包。

 

go get github测试数据/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}}。

 

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

查看更多关于Go语言实战 - revel框架教程之CSRF(跨站请求伪造)的详细内容...

  阅读:63次