Tomcat 7 新特性学习之一 - 防止CSRF攻击

Tomcat 7 Beta版本出来已经有段时间了,看了JavaEye上的朋友,还是有几个非常勤奋每天都在学习的朋友,他们能够每天学习,坚持下来,实属不易,他们非常的年轻,有几个,我还见过面,小伙子们的好学精神实在让人敬佩。这个社会很浮躁,我自己也是这样,尤其在杭州这种城市里生活,会有一定的压力,毕竟人总是想要更好的生活:想买大大的房子,买个自己喜欢的车子,自己的小孩上学不用着急她的学费。做人的乐趣很多,真想好好的去外面旅游一番,小女儿也刚刚出生,为了去米国,早早地把她送回了老家,我很想她。期盼着公司赶紧定下来,我好回家呆上10几天,跟女儿好好的享受一下天伦之乐。

 

现在上班不知道为什么特别反感,一上班就觉得没劲,不是因为自己没有激情,在公司里效率太低了,我很多的idea,都在家里想出来的。我是会自己压力的人,没办法,在这个社会生存除了兴趣之外,确实还是需要像愚公移山一样的精神,每天学习,每天进步,这样才能不会被社会所淘汰。公司里打工确实是不容易的事情,我们的项目早已ready,但是因为是跨国合作,想一个项目出去必须得各个方面都要准备好,这个是我一直担心的问题,部门的发展好坏就取决于此了,真不甘心如何真的就这样失败了,有时候就像和平年代的军队一般,没有战可打是痛苦的,做个军人死也要死在战场上。我的几个大领导是非常好的人,也是非常有经历的人,跟他们学了很多东西。

 

我知道我自己的特点是什么,我是勤奋的人,好几个月没有学习,实在是让人有点心慌。想想写blog,还是很好的方式,既然要学习和总结,那就从比较新的Tomcat 7 的新特性学起吧。

 

1. Use of a Nonce to Prevent Cross-Site Request Forgery (CSRF) Attacks

1) 什么是CSRF

CSRF:Cross Site Request Forgery,跨站请求伪造,也被称作Session Riding,它的本质是利用你的合法身份,来发送恶意请求。CSRF能够做的事情包括:以你的名义发送电子邮件,发消息,盗取你的账号,甚至购买商品,虚拟货币转账,这些东西会给你造成财产安全和个人隐私泄露等威胁。

 

CSRF攻击,早在2000年已经被国外的安全人员提出,但在国内,直到2006年才开始被关注,2008年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞。

 

2) CSRF的工作原理及示例



由上图可以看到,攻击者充分利用了trusted site在用户登录以后,包含sessionID的Cookie一直保存在客户的PC上,当危害站点B发送给用户包含恶意请求的URL时,用户点击后,不用再登陆site A,因为cookie一般保存在http head里,发送给SiteA的所有请求,cookie值都会包含在之后的request里面。如果恶意请求是删除用户资料,修改用户资料等操作时,损失可能就是致命的。

 

典型案例如下:

I. 用户a访问并登录银行网站A:http://www.asite.com

 

A site 以get请求可以进行转账服务:

http://www.asite.com/transferMoney.do?toBankAccountID=112233&amount=1000

上面URL表示,向账号ID112233转账1000


II. 在用户a仍然登录状态时,恶意站点B给用户a发送电子邮件,邮件里有url:

<a href="http://www.asite.com/transferMoney.do?toBankAccountID=112233&amount=1000">click</a>

 

III. 用户a点击URL,扣款请求发生,a账号里面的钱就少了1000块钱

 

3) Tomcat 7是如何避免CSRF的

传统的防止CSRF攻击的方法是使用一个随机数(nonce),如果Wikipedia中定义的:在验证协议中,使用一个随机数以确保原来的通信不能被重用。

 

Tomcat7定义了一个servlet过滤器,它在每一次request请求处理后,在session中存储了一个随机数。这个随机数必须在随后的请求中作为请求参数。这个Servlet filter会在服务器端检查请求中的随机数是否和存储在user session中的随机数相同。如果相同,则这个请求只能从指定的站点而来。如果不相同,则这个请求是别的站点来的,因此会被拒绝。

 

这个Servlet过滤器很简单,下面是相关的源代码片段:

 

class CsrfPreventionFilter extends FilterBase {

...public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

...

String previousNonce = req.getParameter(Constants.CSRF_NONCE_REQUEST_PARAM);

String expectedNonce = (String) req.getSession(true).getAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME);

if (expectedNonce != null && !expectedNonce.equals(previousNonce)) {    res.sendError(HttpServletResponse.SC_FORBIDDEN);

return;

}

String newNonce = generateNonce(); req.getSession(true).setAttribute(Constants.CSRF_NONCE_SESSION_ATTR_NAME, newNonce);

...

因此,每个URL必须在用户回话中包含一个随机数,下面是一个例子:

 

没有包含随机数的URL:

 

< c:url var="url" value="/show" > < c:param name="id" value="0" / >< /c:url >< a href="${show}" >Show< /a >

 

包含随机数的URL:

< c:url var="url" value="/show" >

< c:param name="id" value="0" / >

< c:param name="org.apache.catalina.filters.CSRF_NONCE" value="${session.org.apache.catalina.filters.CSRF_NONCE}" / >

< /c:url >< a href="${show}">Show< /a >

 

 

参考资料

1.http://wenku.baidu.com/view/9fe72df8941ea76e58fa041b.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值