配置 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 完成了这项工作。