Java 配置esapi以缓解XSS SQLI{GET/POST data}的完美方法
我们有一个jaxrs服务,不幸的是执行了原始查询,没有准备好的语句。我们使用ESAPI来缓解XSS、SQLI。如下所示:Java 配置esapi以缓解XSS SQLI{GET/POST data}的完美方法,java,jax-rs,esapi,Java,Jax Rs,Esapi,我们有一个jaxrs服务,不幸的是执行了原始查询,没有准备好的语句。我们使用ESAPI来缓解XSS、SQLI。如下所示: private String mitigateSQLI(String value) { Encoder instance = ESAPI.encoder(); Codec c = new MySQLCodec(MySQLCodec.Mode.ANSI); return instance.encodeForSQL(c, val
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,因为我们知道查询是连接和形成的
想知道缓解这些问题的最佳方式/配置。方法可以是ESAPI属性或这些ESAPI可用的方法。需要注意的是,ESAPI的SQLi编解码器的设计意图是在妥协后的场景中提供紧急支持,以便为您赢得时间,用
PreparedStatement
或类似的语句重写易受攻击的查询。OWASP不能保证,因为各种RDBMS实现中存在的特殊语言怪癖通常不是公共知识。并不是说ESAPI根本不会保护您——但它永远不会像PreparedStatement
那样好。我只希望得到部分缓解
我还建议不要使用Jsoup代替
Validator.getValidSafeHTML()
。Jsoup将尝试“纠正”无效的HTML,而在输入验证和安全HTML的上下文中,这会变得非常复杂 不要逃避选择。如表中以粗体引用的
主要防御:
- 选项1:使用准备好的语句(带参数化查询)
- 选项2:使用存储过程
- 选项3:白名单输入验证
- 选项4:转义所有用户提供的输入
- 另外:强制执行最低特权
- 另外:执行白名单输入验证作为次要防御
根据应用程序需求配置ESAPI.properties非常重要。当不使用Prepared语句时,必须在服务器端转义输入。对于Java,Apache的StringEscapeUtils完成了这项工作。谢谢,ESAPI是否可以处理POST请求?例如,JSON作为POST数据。@Manasi ESAPI验证输入字符串的GET或POST。我假设您一定创建了HTTP拦截器来捕获GET/POST数据。离开拦截器和/或servlent filters@Manasi,安全问题在该级别上是无法解决的!您的答案应该是公认的答案,并且来自ESAPI的一位共同领导。ESAPI的SQL编解码器(全部)只是权宜之计。我宁愿删除我的答案,因为我没有看到你的答案,但这取决于你。我想我的答案和你的答案是一致的!