代码之家  ›  专栏  ›  技术社区  ›  Christopher

如何确保文件路径在C中是安全的?

  •  4
  • Christopher  · 技术社区  · 15 年前

    我有一个ASP.NET MVC应用程序,它的路由允许用户请求存储在Web应用程序目录之外的文件。

    我将通过告诉您它最终将把它们限制在一个安全的目录中来简化场景,使它们能够完全访问该目录。

    例如:

    如果用户(ID为100)请求:

    http://mysite.com/Read/Image/Cool.png
    

    然后我的应用程序将“cool.png”附加到“c:\imagerepository\users\100\”并将这些字节写入响应。工作进程可以访问此路径,但匿名用户不能访问。我已经有这个工作了。

    但是,一些恶意用户是否能够请求如下内容:

    http://mysite.com/Read/Image/..\101\Cool.png
    

    并决心

    "C:\ImageRepository\Customers\101\Cool.png"
    

    (其他用户的图像?!)

    或者类似的?有没有一种方法可以确保路径是干净的,这样用户就可以被约束到自己的目录?

    5 回复  |  直到 12 年前
        1
  •  4
  •   Tor Haugen    15 年前

    怎么样

    var fileName = System.IO.Path.GetFileName(userFileName);
    var targetPath = System.IO.Path.Combine(userDirectory, fileName);
    

    这样可以确保您只获得一个简单的文件名。

        2
  •  0
  •   Zach Johnson    15 年前

    也许您应该验证路径是否以用户的目录路径开始?

    例如 "C:\ImageRepository\Customers\100\"

    在比较时,还应该规范化到大写字母的路径。

        3
  •  0
  •   JohnFx    15 年前

    如果是一个选项(您使用的是Windows身份验证),最安全的方法是通过对文件夹使用Active Directory权限使其成为非问题,这样用户是否尝试访问无效的目录就无关紧要。

    如果没有,则存储文件,以便从用户抽象出路径。也就是说,在具有文件实际路径的表中使用用户提供的任何名称作为查找。

    异色化保护是一项棘手的工作,试图超越潜在攻击者是很危险的。

        4
  •  0
  •   Jeremy Morgan    15 年前

    使用request.mappath重载是检查此问题的一种方法:

    try
    {
      string mappedPath = Request.MapPath( inputPath.Text,                                  Request.ApplicationPath, false);
    }
    catch (HttpException)
    {
      // do exception handling
    }
    

    此外,您还可以分解字符串并用斜线分隔它,并检查用户名是否匹配。

        5
  •  0
  •   hultqvist    12 年前

    要在您可以使用的路径中包含子目录,请执行以下操作:

    string SafeCombine(string basePath, string path)
    {
        string testPath = Path.GetFullPath(Path.Combine(basePath, path));
        if (testPath.startsWith(basePath))
            return testPath;
        throw new InvalidOperationException();
    }