3

Fortify 在进行新文件(路径)比较的线路上给出路径操作错误。我正在使用 Struts 2。

谁能告诉我如何解决这个问题,以便 fortify 不会给出这个错误?

private boolean filePresent(String fileName) {
    if (fileName != null) {
        String path = getDirPath();
        if (path != null) {
            path = path.endsWith("/") ? path : path + "/";
            path = path + fileName;
            if (new File(path).exists()) {
                setFileName(fileName);
                return true;
            }
        }
    }
    return false;
}

我需要查看该文件是否存在于我们的 Web 服务器中,因此我将文件名作为参数传递,从 web.xml 获取整个目录路径,将其附加到文件名中,然后组合路径并检查它针对 File 对象查看它是否存在。

4

2 回答 2

6

您不希望远程 Web 用户查看 C:/Windows/System32 是否存在,或者 /etc/hosts 是否存在,因为这允许他们对您的服务器进行取证研究。

您可能没有意识到您的函数允许他们通过在输入字符串中包含适当数量的“..”序列来做到这一点。

有两种方法可以阻止问题:

  1. 白名单方法。清除输入参数中的所有字符,只允许“a”到“z”,也许还有“.”。如果输入超出这些范围,则抛出异常。

1a。或者,如果您知道有效文件的列表少于 20 个,只需将它们列出,如果输入不完全匹配,则抛出异常。

  1. 黑名单方法。检查输入,如果它包含任何序列“..”或任何正斜杠或反斜杠,则抛出异常。这通常不是深度防御,但是对于我现在阅读的功能,这没关系。
于 2012-03-31T11:00:05.137 回答
0

你甚至可以使用过滤器来做到这一点

在过滤器中

chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);

在 RequestWarper 使用类似的东西

if(value.contains("..\\"))
value = value.replace("..\\", "");
        if(value.contains("../"))
            value = value.replace("../", "");
        if(value.contains("./"))
            value = value.replace("./", "");
于 2013-12-19T12:50:17.390 回答