一种基于Apache的CSRF防御模块的实现
2017-10-13王马龙
◆王马龙 刘 健
一种基于Apache的CSRF防御模块的实现
◆王马龙 刘 健
(四川大学计算机学院 四川 610065)
跨站请求伪造(CSRF)漏洞的存在十分广泛,而且是开放式web应用安全项目(OWASP)统计的Top 10 Web攻击列表中最具威胁的漏洞之一。目前最具代表性的两种CSRF防御工具是CSRFGuard[2]和jCSRF[3]。针对CSRFGuard会将JS动态创建的动态HTTP请求误认为是CSRF攻击;jCSRF以代理模式部署,会增大web服务器的响应时间这两大问题,本文通过重写XMLHttpRequest对象onsend的方法,向HTTP头注入CSRF防御Token,基于Apache web 服务器实现了一个CSRF防御模块mod_anticsrf,去除了代理的网络通信开销。实验结果表明,mod_anticsrf支持动态HTTP请求,且几乎不影响web服务器的响应时间。
CSRF;Apache;动态HTTP请求;性能
0 引言
跨站请求伪造(Cross-Site Request Forgery,CSRF)攻击是一种当今互联网上广泛存在的Web攻击。近几年来,CSRF在OWASP(Open Web Application Security Project)每年的十大安全漏洞中[1]始终能够稳居前列。它并不是一种新型的攻击,但是其攻击原理简单,极具破坏性。由于CSRF漏洞存在于大量的Web应用程序中,如果通过手动修改程序源代码的方式来修复漏洞,工作量将十分巨大。基于此,本文基于ApacheWeb服务器实现了一种CSRF防御模块。
1 CSRF防御工具现状
CSRFGuard[2]和jCSRF[3]都是基于一次性Token的方法实现的CSRF防御工具。CSRFGuard是由OWASP发布的CSRF防御技术。它是一个实现了 Token模式的JAVA类库[4],通过生成随机的Token,而攻击者无法构造有效请求,从而对CSRF攻击进行防御。它的缺点是:(1)只有Javaweb应用服务器能使用;(2)它使用JavaScript DOM注入Token的方法是在页面加载完后遍历页面所有元素,对“form”或“a”等元素或属性插入Token。因此,CSRFGuard比较适合处理静态页面。如果有表单在页面加载完后由JavaScript脚本动态创建,其提交的请求不能被CSRFGuard插入Token,相关页面的操作也可能因缺少Token被阻止或者可能遭受CSRF攻击。……
