安全开发组件ESAPI简介

admin 2024年2月8日14:53:24评论14 views字数 4246阅读14分9秒阅读模式

简介

OWASP Enterprise Security API (ESAPI)是一个免费、开源的web应用程序安全控制库,使程序员更容易编写风险较低的应用程序。ESAPI库旨在使程序员更容易对现有应用程序进行安全性改造。ESAPI库也是新开发的坚实基础。

ESAPI 框架

ESAPI安全控件

OWASP ESAPI 已经实现下面安全控件

  • 身份认证
  • 访问控制
  • 输入验证
  • 输出编码/转义
  • 密码
  • 错误处理和日志
  • 通信安全
  • HTTP 安全
  • 安全配置

ESAP与OWASP漏洞对应关系

安全开发组件ESAPI简介

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.propertiesesapi-java-logging.propertiesvalidation.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编码结果如下:x3Cscriptx3Ealertx28123x29x3Cx2Fscriptx3Ex27x2Fx3Ex3Cimgx20srcx3Donerrorx3Dalertx28123x29x3ECSS编码结果如下: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%3EXML编码结果如下:<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);

如下面文件名校验代码实例

1. 
//文件拓展名校验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简介

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月8日14:53:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安全开发组件ESAPI简介http://cn-sec.com/archives/2481390.html

发表评论

匿名网友 填写信息