点击阅读原文进入 另为了挣到10000块,他在VSRC投了一篇稿!
本文用到的技术
1、AOP
2、ESAPI
关于AOP技术
AOP(Aspect-Oriented Programming)面向切面编程。切面是什么?切面表示从业务逻辑分离出来的横切逻辑,比如性能监控、日志记录、权限控制,这些功能可从核心逻辑代码中抽离出去。也就是说AOP可以解决代码耦合问题,让职责更加单一。
这里要讲的是利用AOP技术解决代码安全问题。把安全代码从业务逻辑中分离出来,让其单一的解决安全问题。
优势:不影响业务代码,修复安全漏洞的时候,可以对原代码很好的继承,不需修改原代码(基于配置定义切点的时候)。
将AOP技术应用于安全技术的案例很少,网上很难找到较多示例代码。
关于ESAPI
OWASP Enterprise Security API (ESAPI)
ESAPI (OWASP企业安全应用程序接口)是一个免费、开源的、网页应用程序安全控件库,它使程序员能够更容易写出更低风险的程序。ESAPI接口库被设计来使程序员能够更容易的在现有的程序中引入安全因素。ESAPI库也可以成为作为新程序开发的基础。
通俗点说ESAPI是OWASP提供的一个安全开发API库。
优势:对比自己开发的安全处理代码更成熟稳定。
ESAPI具体的使用实际也是比较少,网上也很难找到较多示例代码。开发过程比较困难点。
AOP技术做XSS防御
OWASP提供了几种XSS防御的方法,包括阻止非信任的数据插入,escaping HTML输入、escaping attribute、escaping JavaScript、以及escaping几种其他类型。ESAPI提供了多种encoding库。另外也可以采用白名单validate方法(比如字母数字),也可以自定义正则表达式。
AOP技术实现ESAPI提供的encoding和validation库,来做XSS攻击的防御工作。
ESAPI提供的几种encoding方法:
1、将用户数据输出到html body某处时,须经过html转义。ESAPI.encoder().encodeForHTML( request.getParameter( "input" ) )
2、将用户数据输出到html标签的属性时,须经过标签属性的转义。ESAPI.encoder().encodeForHTMLAttribute( request.getParameter( "input" ) )
3、将用户数据输出到JavaScript数据域时,须经过JavaScript转义。ESAPI.encoder().encodeForJavaScript( request.getParameter( "input" ) )
4、将用户数据输出到URL的参数时,须经过URL转义。ESAPI.encoder().encodeForURL( request.getParameter( "input" ) )
1
方案逻辑
2
定义切点的注解
在需要进行XSS防御的方法前使用相应的注解。
3
定义切面类
拦截指定方法,遍历String类型参数,和数据模型(JAVABean)中的String属性,并对其进行XSS validate。
使用ESAPI库处理XSS攻击input
针对XSS攻击不同location与类别,提供相应的encoding方法。
判定是否简单数据类型
4
Controller中使用
在Contoller层使用前面定义的注解,进行XSS攻击防护。
AOP技术做FileUpload防御
1
方案逻辑
2
定义切点的注解
3
定义切面类
使用ESAPI中的文件上传校验库。
4
Controller中使用
AOP技术做SQL注射防御
消除SQL注射漏洞主要有3种方法:参数化查询、存储过程(类似参数化查询,但是query存在在数据库上,供应用调用)、escaping用户输入。另外一种是做白名单验证,阻止查询中输入非法的格式。我这里选择escaping用户输入和白名单validate。其优点是可以不修改原代码。Aspects能去拦截和分析query,然后在执行前escape所有的表达式(expressions,可能包含恶意内容)。
而参数化查询需要重写动态查询代码,存储过程需要开发move所有查询到数据库层。都需要修改原有代码,可能引入bug和未知行为。此外OWASP提供了一个安全的encoding库,可以直接调用。
1
方案逻辑
2
SQL Injection validator逻辑
Aspect拦截到query后,先进行注释移除,然后利用JSqlParser API对query的where进行解析,输出简单的expression List。
遍历上一步获得的simpleExpressions,对其进行语义重复检测(类似1=1),如果检测到有语义重复,就替换成“1=2”。
最后对类型为String的value进行encode。
https://github.com/JSQLParser/JSqlParser/wiki
ESAPI Encode
ESAPI.encoder().encodeForSQL()
编码结果样例:
输入:foo" and 1 = 2
输出:foo\" and 1 \= 2
SQL Parser逻辑
。
。
精彩原创文章投稿有惊喜!
VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将为您准备的丰富奖金税后1000元现金或等值礼品,上不封顶!如若是安全文章连载,奖金更加丰厚,税后10000元或等值礼品,上不封顶!可点击“阅读原文”了解规则。(最终奖励以文章质量为准。活动最终解释权归VSRC所有)
不知道,大家都喜欢阅读哪些类型的信息安全文章?
不知道,大家都希望我们更新关于哪些主题的干货?
现在起,只要您有任何想法或建议,欢迎直接回复本公众号留言!
精彩留言互动的热心用户,将有机会获得VSRC赠送的精美奖品一份!
同时,我们也会根据大家反馈的建议,选取热门话题,进行原创发布!
点击阅读原文进入 另为了挣到10000块,他在VSRC投了一篇稿!