我们有一个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/

10-10 03:10