简介
OWASP Enterprise Security API (ESAPI)是一个免费、开源的web应用程序安全控制库,使程序员更容易编写风险较低的应用程序。ESAPI库旨在使程序员更容易对现有应用程序进行安全性改造。ESAPI库也是新开发的坚实基础。
ESAPI 框架
ESAPI安全控件
OWASP ESAPI 已经实现下面安全控件
-
身份认证 -
访问控制 -
输入验证 -
输出编码/转义 -
密码 -
错误处理和日志 -
通信安全 -
HTTP 安全 -
安全配置
ESAP与OWASP漏洞对应关系
ESAPI 的使用
安装
pom文件中增加依赖
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.5.3.1</version>
运行的话还需要将配置文件导入到resource中。从git中下载git clone [email protected]:ESAPI/esapi-java-legacy.git
从源码中可以找到ESAPI.properties
、esapi-java-logging.properties
、validation.properties
三个文件
注入类问题防护
注入类问题占所有风险问题的很大一部分,这类问题主要是由于对外部输入使用的过程中转码不当造成的,例如:SQL 注入、命令注入、跨站脚本等等。Encode(编码器接口)包含了许多解码输入和编码输出的方法,这样处理过的字符对于各种解释器都是安全的。
XSS代码实例
代码如下:
1. package com.test;
2. import org.owasp.esapi.ESAPI;
3. import org.owasp.esapi.errors.EncodingException;
5. public class Main {
6. public static void main(String[] args) throws EncodingException {
7. // System.out.println("Hello world!");
8. String XSSText="<script>alert(123)</script>'/><img src=onerror=alert(123)>";
9. String XSSFilterByHTML = ESAPI.encoder().encodeForHTML(XSSText);
10. System.out.println("HTML编码结果如下:"+XSSFilterByHTML);
12. String XSSFilterByJavascript = ESAPI.encoder().encodeForJavaScript(XSSText);
13. System.out.println("Javascript编码结果如下:"+XSSFilterByJavascript);
15. String XSSFilterByCSS = ESAPI.encoder().encodeForCSS(XSSText);
16. System.out.println("CSS编码结果如下:"+XSSFilterByCSS);
18. String XSSFilterByHTMLAttribute = ESAPI.encoder().encodeForHTMLAttribute(XSSText);
19. System.out.println("HTML属性编码结果如下:"+XSSFilterByHTMLAttribute);
21. String XSSFilterByURL = ESAPI.encoder().encodeForURL(XSSText);
22. System.out.println("URL编码结果如下:"+XSSFilterByURL);
24. String XSSFilterByXML = ESAPI.encoder().encodeForXML(XSSText);
25. System.out.println("XML编码结果如下:"+XSSFilterByXML);
27. String XSSFilterByXMLAttribute = ESAPI.encoder().encodeForXMLAttribute(XSSText);
28. System.out.println("XML属性编码结果如下:"+XSSFilterByXMLAttribute);
31. }
32. }
输出结果如下:
HTML编码结果如下:<script>alert(123)</script>'/><img src=onerror=alert(123)>
Javascript编码结果如下:
x3Cscriptx3Ealertx28123x29x3Cx2Fscriptx3Ex27x2Fx3Ex3Cimgx20srcx3Donerrorx3Dalertx28123x29x3E
CSS编码结果如下:3c script3e alert28 12329 3c 2f script3e 27 2f 3e 3c img20 src3d onerror3d alert28 12329 3e
HTML属性编码结果如下:<script>alert(123)</script>'/><img src=onerror=alert(123)>
URL编码结果如下:%3Cscript%3Ealert%28123%29%3C%2Fscript%3E%27%2F%3E%3Cimg+src%3Donerror%3Dalert%28123%29%3E
XML编码结果如下:<script>alert(123)</script>'/><img src=onerror=alert(123)>
XML属性编码结果如下:<script>alert(123)</script>'/><img src=onerror=alert(123)>
可见对攻击字符进行了转义处理
SQL注入防护
String userId = "tom' or '1=1'";
String sql = "select * from user where user='"
+ ESAPI.encoder().encodeForSQL(new MySQLCodec(MySQLCodec.Mode.STANDARD), userId) + "'";
System.out.println("SQL编码结果如下:"+sql);
采用了ESAPI.encoder().encodeForSQL()对输入的注入字符做了处理
输出结果如下:
SQL编码结果如下:select * from user where user='tom' or '1=1''
命令注入
String input = "dir & dir /s";
String cmd = ESAPI.encoder().encodeForOS(new WindowsCodec(), input);
System.out.println("命令执行处理结果如下:"+cmd);
输出结果如下:
命令执行处理结果如下:dir^ ^&^ dir^ ^/s
输入校验问题的防护
网络安全最大的威胁是外部输入,所以对外部输入的校验对应用安全起着最大的防护作用。这个校验就是上面说到的validation.properties
配置文件
Validator.SafeString=^[.\p{Alnum}\p{Space}]{0,1024}$
Validator.Email=^[A-Za-z0-9._%'-]+@[A-Za-z0-9.-]+\.[a-zA-Z]{2,4}$
Validator.IPAddress=^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Validator.URL=^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\:\'\/\\\+=&;%\$#_]*)?$
Validator.CreditCard=^(\d{4}[- ]?){3}\d{4}$
Validator.SSN=^(?!000)([0-6]\d{2}|7([0-6]\d|7[012]))([ -]?)(?!00)\d\d\3(?!0000)\d{4}$
校验接口
/**
* 输入校验
*
* @param context 校验内容
* @param input 校验输入
* @param type 校验类型,对应到 validation.properties 中的类型
* @param maxLength 输入字符最大长度校验
* @param allowNull 输入字符Null值校验,false - 不允许;true - 允许
* @return 校验失败返回 false,校验成功返回 true
*/
boolean ESAPI.validator().getValidInput(String context, String input, String type, int maxLength, boolean allowNull);
如下面文件名校验代码实例
//文件拓展名校验
2. String fileName = "test.exe";
3. List<String> allowedExtensions = new ArrayList<String>();
4. allowedExtensions.add("pdf");
5. allowedExtensions.add("doc");
7. if (ESAPI.validator().isValidFileName("test",fileName, allowedExtensions,false)) {
8. System.out.println(fileName+"文件拓展名校验通过");
9. } else {
10. System.out.println(fileName+"文件拓展名校验不通过");
11. }
允许的拓展名是pdf、doc格式,但是上传接受到的文件拓展名是exe,使用ESAPI进行验证,失败禁止上传
输出结果:test.exe文件拓展名校验不通过
当然还有其他输入验证,详情见:OWASP Enterprise Security API (ESAPI) | OWASP Foundation
原文始发于微信公众号(YY的黑板报):安全开发组件ESAPI简介
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论