Trick/Workaround HP Fortify LDAP 注入查找

Trick/Workaround HP Fortify LDAP Injection Finding

我正在进行 LDAP 调用,我需要在其中使用用户输入到 LDAP 过滤器中的字符串。我已通过从字符串中删除所有非字母数字字符来清理数据。

public static String alphanumericOnly(String input) {
    return input == null ? "" : input.replaceAll("\W|_", "");
}

但是,HP Fortify 将交换标记为 LDAP 注入漏洞,尽管我已尽职调查以确保没有 LDAP 元字符,因此可以执行 LDAP 注入攻击。

我正在寻找一种方法来欺骗 HP Fortify,使其不会标记此交互。

我注意到在 HP Fortify 的其他用途中,如果我的字符串输入是整数,我可以将其解析为 int(在本例中为 BigInteger),然后我可以在字符串中使用它,而 HP Fortify 将忽略它在检查日志伪造时:

BigInteger id = new BigInteger(ValueChecker.numericOnly(request.getID()));
logger.info(id + " - Request Received.");

在我看来,可能有一种类似的方法可以诱使 HP Fortify 忽略 LDAP 注入问题,因为我已经验证了数据。

我尝试过的简单解决方法没有奏效:

我不想隐藏或压制 Fortify 的调查结果。我想 trick/workaround 强化,这样它们就不会被标记。

有什么想法吗?

我明白了。这可以通过将 String 转换为代码点的 int 数组然后将其转换回来来完成。这提供了足够的间接手段来欺骗 Fortify,并且问题不会被标记。

public static String scrub(String input) {

    // remove all non-alphanumeric characters
    String sanitized = alphanumericOnly(input);

    // trick Fortify by storing chars
    // as codepoints in an int array
    int[] codepoints = new int[sanitized.length()];

    for(int i = 0; i < sanitized.length(); ++i) {
        codepoints[i] = sanitized.codePointAt(i);
    }

    return new String(codepoints, 0, codepoints.length);
}