修复路径操纵错误

时间:2012-03-16 23:45:04

标签: java validation fortify

Fortify在线上进行Path Manipulation错误,进行新的File(路径)比较。我正在使用Struts 2.

任何人都可以告诉我如何解决这个问题,以便强化不会出现此错误吗?

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.xml获取整个目录路径,将其附加到文件名和&然后组成路径&检查File对象以查看它是否存在。

2 个答案:

答案 0 :(得分:4)

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

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

有两种方法可以解决问题:

  1. 白名单方法。清除输入参数中的所有字符,只允许“a”到“z”,也许只允许“。”如果输入超出这些范围,则抛出异常。
  2. 1a上。或者,如果您知道有效文件列表少于20,则只列出它们,如果输入没有完全匹配,则抛出异常。

    1. 黑名单方法。如果输入包含任何序列“..”或任何正斜杠或反斜杠,请检查输入并抛出异常。这通常不是深度防御,但对于你现在阅读它的功能,这没关系。

答案 1 :(得分: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("./", "");