1. ESAPI介绍

OWASP® ESAPI(OWASP 企业安全 API)是一个免费的开源 Web 应用程序安全控制库,可帮助程序员更轻松地编写低风险应用程序。ESAPI for Java 库旨在帮助程序员更轻松地将安全性改进到现有应用程序中。ESAPI for Java 也为新开发奠定了坚实的基础。

官方Github https://github.com/ESAPI/esapi-java-legacy

2. 环境搭建

搭建环境

  • jdk-17.0.16 JDK版本对ESAPI有影响
  • esapi 2.7.0.0

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencies>
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.7.0.0</version>
<classifier>jakarta</classifier>
</dependency>

<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.1.0</version>
<scope>compile</scope> <!-- provider会编译失败,可能是我未托管至Tomcat等容器 -->
</dependency>
</dependencies>

https://github.com/ESAPI/esapi-java-legacy/releases 下载最新版本的configuration.jar,解压configuration\esapi\目录下的ESAPI.propertiesvalidation.properties;随后放在项目的resources目录下

也可以手动指定esapi所用的resource目录

1
2
3
static {
System.setProperty("org.owasp.esapi.resources", "your-path");
}

3. 代码示例

3.1 对字符串进行编码

1
2
3
4
String input = "<a href='lrui1'></a> < script > alert('xss'); </ script >";
String encodedString = ESAPI.encoder().encodeForHTML(input);

System.out.println("EncodeForHTML: {}" + encodedString);

3.2 对邮箱进行验证

1
2
3
4
5
6
String input = "xxx@gmail.com";  
if (!ESAPI.validator().isValidInput("", input, "Email", 100, false)) {
System.out.println("Email validate fail!");
} else {
System.out.println("Email is validate.");
}

3.3 ESAPI.validator().isValidInput

方法签名

1
boolean isValidInput(String context, String input, String type, int maxLength, boolean allowNull) throws IntrusionException;

方法参数简介

1
2
3
4
5
6
7
8
9
context – 用于描述您正在验证的参数的名称(例如,"LoginPage_UsernameField")。此值将用于记录或处理与传入值相关的任何日志或错误处理。

input – 待验证的实际用户输入数据。

type – 映射至"ESAPI.properties"中实际正则表达式的正则表达式名称

maxLength – 允许输入的最大字符串长度。

allowNull – 如果允许空值为真,则输入为NULL或空字符串时视为合法。若允许空值为假,则NULL或空字符串将引发验证异常。

4. 参考链接

一文详解应用安全防护ESAPI - 华为云开发者联盟 - 博客园

Add support for Jakarta Servlet API Specification · ESAPI/esapi-java-legacy · Discussion #768