配置 esapi 以缓解 XSS SQLI {GET/POST 数据} 的完美方法
Perfect way to configure esapi to mitigate XSS SQLI {GET/POST data}
我们有一个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("[=11=]", "");
// 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/configuration 减轻这些事情。方法可以是 ESAPI 属性或这些 ESAPI 可用方法。
重要的是要注意 ESAPI 的 SQLi 编解码器的设计意图是在 post 妥协场景中提供紧急支持,以便为您争取时间使用 PreparedStatement
或重写易受攻击的查询一些等效的。 OWASP 不提供任何保证,因为存在于各种 RDBMS 实现中的特殊语言怪癖通常不是常识。并不是说 ESAPI 根本不会保护你——但它永远不会像 PreparedStatement
那样好。我希望只有部分缓解。
我还建议不要使用 Jsoup 代替 Validator.getValidSafeHTML()
。 Jsoup 将尝试 "correct" 无效 HTML,这在输入验证和安全 HTML 的上下文中变得非常复杂。
不要 运行 转向其他选择。在 OWASP
中以粗体引用
主要防御:
- 选项 1:使用 准备好的语句(带有参数化查询)
- 选项 2:使用 存储过程
- 选项 3:白名单 输入验证
- 选项 4:转义 所有用户提供的输入
附加防御:
- 另外:强制执行 最小权限
- 另外:执行白名单输入验证作为二级防御
根据应用程序要求配置 ESAPI.properties 很重要。不使用 Prepared Statement 时,您必须转义服务器端的输入。对于 Java ,来自 Apache 的 StringEscapeUtils 完成了这项工作。
我们有一个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("[=11=]", "");
// 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/configuration 减轻这些事情。方法可以是 ESAPI 属性或这些 ESAPI 可用方法。
重要的是要注意 ESAPI 的 SQLi 编解码器的设计意图是在 post 妥协场景中提供紧急支持,以便为您争取时间使用 PreparedStatement
或重写易受攻击的查询一些等效的。 OWASP 不提供任何保证,因为存在于各种 RDBMS 实现中的特殊语言怪癖通常不是常识。并不是说 ESAPI 根本不会保护你——但它永远不会像 PreparedStatement
那样好。我希望只有部分缓解。
我还建议不要使用 Jsoup 代替 Validator.getValidSafeHTML()
。 Jsoup 将尝试 "correct" 无效 HTML,这在输入验证和安全 HTML 的上下文中变得非常复杂。
不要 运行 转向其他选择。在 OWASP
中以粗体引用主要防御:
- 选项 1:使用 准备好的语句(带有参数化查询)
- 选项 2:使用 存储过程
- 选项 3:白名单 输入验证
- 选项 4:转义 所有用户提供的输入
附加防御:
- 另外:强制执行 最小权限
- 另外:执行白名单输入验证作为二级防御
根据应用程序要求配置 ESAPI.properties 很重要。不使用 Prepared Statement 时,您必须转义服务器端的输入。对于 Java ,来自 Apache 的 StringEscapeUtils 完成了这项工作。