我们有一个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,知道查询是串联并形成的。
想知道是否有减轻这些问题的最佳方法/配置。方式可以是ESAPI属性或这些ESAPI可用方法。
最佳答案
不要逃避其他选择。如OWASP中粗体所示
主要防御:
选项1:使用准备好的语句(带有参数化查询)
选项2:使用存储过程
选项3:白名单输入验证
选项4:转义所有用户提供的输入
其他防御措施:
另外:实施最低权限
另外:将白名单输入验证作为辅助防御
根据应用程序要求配置ESAPI.properties很重要。不使用Prepared Statement时,必须在服务器端转义输入。对于Java,Apache的StringEscapeUtils可以完成这项工作。
关于java - 配置esapi缓解XSS SQLI {GET/POST data}的完美方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57611710/