读书人

bboss 动态令牌机制轻松搞定网站跨站攻

发布时间: 2014-07-18 16:36:09 作者: rapoo

bboss 动态令牌机制轻松搞定网站跨站攻击和表单重复提交问题
bboss 动态令牌机制轻松搞定网站跨站攻击和表单重复提交问题,本文详细介绍之。
最新代码请参考文档获取:
bbossgroups 项目下载地址

一、概述
boss在安全方面下了不少功夫,为了解决网站跨站攻击和表单重复提交问题提供了动态令牌机制,具体内容如下:
1.增加动态令牌检测过滤器(可独立使用,也可与安全认证过滤器结合使用)
2.增加dtoken标签(用来在表单或者请求中投放动态令牌)
3.增加assertdtoken标签(用来在接收请求的服务器jsp页面头部判断客户端是否正确传递令牌,并检测令牌是否有效,如果没有令牌或者令牌无效,那么拒绝客户端请求)
4.assertdtoken注解(用来在接收请求的服务器mvc控制器方法执行前判断客户端是否正确传递令牌,并检测令牌是否有效,如果没有令牌或者令牌无效,那么拒绝客户端请求)

令牌的过滤器的详细配置请参考web.xml文件:
/bboss-mvc/WebRoot/WEB-INF/web.xml
/bboss-mvc/WebRoot/WEB-INF/web-tokenfilter.xml(令牌过滤器独立使用配置示例)
/bboss-mvc/WebRoot/WEB-INF/web-token.xml(与安全认证过滤器结合使用示例)

动态令牌机制可以有效解决以下问题:
1.防止表单重复提交
2.防止跨站脚本编制漏洞
3.防止跨站请求伪造攻击
4.有效避免框架钓鱼攻击
5.有效防止链接注入攻击

二、过滤器组件
我们通过令牌过滤器来拦截需要做令牌检测的url请求,过滤器组件如下:
1.org.frameworkset.web.token.TokenFilter(单独使用的令牌过滤器)
TokenFilter配置示例如下:


<pg:dtoken/>标签将生成一个隐藏的动态令牌参数,将随着表单的提交而提交,该令牌只在本次请求中有效,不能被重复使用,这样就达到了解决了表单重复提交和跨站攻击的问题。

2.url的参数串中
<a href="/aaa/xxx.page?<pg:dtoken element='param'/>"
通过element='param'指定令牌以参数名=令牌的方式追加在url的参数中,随着url一起提交。该令牌只在本次url请求中有效,不能被重复使用,这样就达到了解决了表单重复提交和跨站攻击的问题。

3.ajax请求的json参数中
$("#queryresult").load("sayHelloEnums.page",{sex:$("#sex").val(),<pg:dtoken element="json"/>});
通过element=="json"指定令牌以参数名:令牌的json参数格式追加在ajax参数中,随着ajax请求一起被提交。该令牌只在本次ajax请求中有效,不能被重复使用,这样就达到了解决了表单重复提交和跨站攻击的问题。

四、assertdtoken标签和assertdtoken注解
通过上述三种方式能够有效地防止表单重复提交,但是能不能有效地防止跨站攻击呢,答案是不能,因为服务端在校验令牌时,首先检测有没有令牌被提交过来,如果没有则忽略令牌检查,认为请求是合法的,这样黑客可以根据该规则尝试将令牌参数从请求参数中去除来达到攻击的目的。为了防止这个漏洞,我们需要借助于assertdtoken标签和assertdtoken注解在服务器端强制要求令牌参数。

assertdtoken标签主要用于接收请求的jsp页面头部,例如:
<%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg"%>
<pg:assertdtoken/>
只有assertdtoken检测到令牌并且令牌合法,才执行后续的处理操作,否则直接跳转到过滤器参数tokenfailpath对应的地址或者抛出403异常。

assertdtoken注解用在bboss mvc控制器方法上,用来标注mvc控制器方法强制要求进行动态令牌校验,只有检测到令牌并且令牌合法,才继续开始执行控制器方法,否则直接跳转到过滤器参数tokenfailpath对应的地址或者抛出403异常。
assertdtoken注解使用实例:



五、生成令牌的java方法

为了方便在java代码中直接生成令牌,bboss的令牌管理组件
org.frameworkset.web.token.MemTokenManager提供了四个工具方法:

具体的使用方法为:

MemTokenManager memTokenManager = org.frameworkset.web.token.MemTokenManagerFactory.getMemTokenManagerNoexception();if(memTokenManager != null)//如果开启令牌机制就会存在memTokenManager对象,否则不存在{String inputtoken = memTokenManager.buildHiddenDToken(request);String jsontoken = memTokenManager.buildJsonDToken("'",request);String parametertoken = memTokenManager.buildParameterDToken(request);String token = memTokenManager.buildDToken(request);}


六、bboss动态令牌实现原理总结

bboss动态令牌机制采用动态令牌和session相结合的方式产生客户端令牌,一次请求产生一个唯一令牌,令牌识别采用客户端令牌和服务端session标识混合的方式进行判别,如果客户端令牌和服务端令牌正确匹配,则允许访问,否则认为用户为非法用户并阻止用户访问并跳转到tokenfailpath参数对应的地址,默认为空(直接响应403)。
令牌存储机制通过参数tokenstore指定,包括两种,内存存储和session存储,默认为session存储,当令牌失效(匹配后立即失效,或者超时失效)后,系统自动清除失效的令牌;采用session方式存储令牌时,如果客户端页面没有启用session,那么令牌还是会存储在内存中。
令牌生命周期:客户端的令牌在服务器端留有存根,当令牌失效(匹配后立即失效,或者超时失效)后,系统自动清除失效的令牌;当客户端并没有正确提交请求,会导致服务端令牌存根变为垃圾令牌,需要定时清除这些 垃圾令牌;如果令牌存储在session中,那么令牌的生命周期和session的生命周期保持一致,无需额外清除机制;如果令牌存储在内存中,那么令牌的清除由令牌管理组件自己定时扫描清除,定时扫描时间间隔由tokenscaninterval参数指定,单位为毫秒,默认为30分钟,存根保存时间由tokendualtime参数指定,默认为1个小时。
可以通过enableToken参数配置指定是否启用令牌检测机制,true检测,false不检测,默认为false不检测。

动态令牌机制可以有效解决以下问题:
1.防止表单重复提交
2.防止跨站脚本编制漏洞
3.防止跨站请求伪造攻击
4.有效避免框架钓鱼攻击
5.有效防止链接注入攻击

最后再总结一下:
1.tokenFilter拦截需要进行令牌校验客户端请求并执行校验逻辑、同时管理令牌的生命周期和提供定时清楚垃圾令牌机制
2.dtoken标签在客户端表单、url请求和ajax请求中投放动态令牌,仅仅在客户端放置动态随机令牌,可有效防止表单重复提交问题,但是不能彻底解决跨站攻击问题(因为狡猾的黑客会想尽办法去除令牌,绕过服务端令牌校验机制,从而达成跨站攻击目标),那么我们需要assertdtoken标签和assertdtoken注解来防止这种欺骗行为。
3.assertdtoken标签在接收请求的服务器jsp页面头部判断客户端是否正确传递令牌,并检测令牌是否有效,如果没有令牌或者令牌无效,那么拒绝客户端请求
4.assertdtoken注解在接收请求的服务器mvc控制器方法执行前判断客户端是否正确传递令牌,并检测令牌是否有效,如果没有令牌或者令牌无效,那么拒绝客户端请求

读书人网 >操作系统

热点推荐