我们有一个 jaxrs 服务,不幸的是执行了原始查询,没有准备好的语句。我们使用 ESAPI 来缓解 XSS、SQLI。如下所示:
private String mitigateSQLI(String value) {
Encoder instance = ESAPI.encoder();
Codec c = new MySQLCodec(MySQLCodec.Mode.ANSI);
return instance.encodeForSQL(c, value);
}
private String mitigateXSS(String value) {
if (value == null)
return null;
// Use the ESAPI library to avoid encoded attacks.
value = ESAPI.encoder().canonicalize(value);
// Avoid null characters
value = value.replaceAll("\0", "");
// Clean out HTML
Document.OutputSettings outputSettings = new Document.OutputSettings();
outputSettings.escapeMode(EscapeMode.xhtml);
outputSettings.prettyPrint(false);
value = Jsoup.clean(value, "", Whitelist.none(), outputSettings);
return value;
}
以及具有默认配置的 ESAPI.properties 文件。
我们仍然在某些场景中面临 SQLI,知道查询是连接和形成的。
想知道是否有最好的方法/配置来缓解这些问题。 Way 可以是 ESAPI 属性或这些 ESAPI 可用方法。
最佳答案
不要逃避其他选择。正如 OWASP 中粗体引用的那样
主要防御:
- 选项 1:使用准备好的语句(带有参数化查询)
- 选项 2:使用存储过程
- 选项 3:白名单输入验证
- 选项 4:转义所有用户提供的输入
额外防御:
- 另外:强制执行最低权限
- 另外:执行白名单输入验证作为辅助防御
根据应用程序需求配置 ESAPI.properties 非常重要。当不使用准备好的语句时,您必须在服务器端转义输入。对于 Java,Apache 的 StringEscapeUtils 可以完成这项工作。
关于java - 配置 esapi 缓解 XSS SQLI {GET/POST data} 的完美方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611710/