Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护
2013-09-09 16:05
971 查看
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}}。
改动不大,但涉及的地方很多,前前后后修改加测试还是花了一个小时。这事儿,一定要在刚开始的时候就考虑到,不然越到后期改起来越悲壮!
现在做网站敢不防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}}。
改动不大,但涉及的地方很多,前前后后修改加测试还是花了一个小时。这事儿,一定要在刚开始的时候就考虑到,不然越到后期改起来越悲壮!
相关文章推荐
- Go语言实战 - revel框架教程之缓存和Job
- revel框架教程之CSRF(跨站请求伪造)保护
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.5 控制器模型绑定
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.6 控制器参数校验
- ABP框架系列之五十四:(XSRF-CSRF-Protection-跨站请求伪造保护)
- Go语言Revel框架 准备工作
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.7 控制器数据响应
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.9 控制器controller编程示例
- Go语言Web框架Revel介绍
- Go语言Revel框架,创建一个Web App
- Go 语言教程实战
- golang实战使用gin+xorm搭建go语言web框架restgo详解6.1 模型M和Orm
- Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫) 下载
- golang实战使用gin+xorm搭建go语言web框架restgo详解10 使用restgo搭建后台管理系统
- Go语言Revel框架 网页请求处理流程
- golang实战使用gin+xorm搭建go语言web框架restgo详解6.4 推荐编程方式
- golang实战使用gin+xorm搭建go语言web框架restgo详解1.1 go语言的困境
- golang实战使用gin+xorm搭建go语言web框架restgo详解7 视图层V
- golang实战使用gin+xorm搭建go语言web框架restgo详解1.2 我要做什么
- golang实战使用gin+xorm搭建go语言web框架restgo详解8 关于模板