删除文件时检查文件路径

atr*_*joe 9 .net c# asp.net

如果我有一个web方法,在调用时删除文件,它接受三个参数(cNum,year和fileName).我是否需要担心这种方法的漏洞利用.我唯一能想到的就是..\..\..\用来进一步推动删除文件夹结构.这应该很容易删除.但还有什么我应该担心的吗?

[WebMethod(EnableSession = true, 
           Description = "Method for deleting files uploaded by customers")]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public Boolean deleteCustFiles(string cNum, string year, string fileName)
{
    try
    {
        if (String.IsNullOrEmpty(cNum) 
            || String.IsNullOrEmpty(year) 
            || String.IsNullOrEmpty(fileName))
                throw new Exception();

        string path = Server.MapPath(@"~\docs\custFiles\" 
                                        + year + @"\" 
                                        + cNum + @"\" + fileName);
        File.Delete(path);
    }
    catch
    {
        throw new Exception("Unable to delete file");
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

cas*_*One 12

我建议使用上的GetFileName方法来清理filename参数,如下所示:Path

public Boolean deleteCustFiles(string cNum, string year, string fileName)
{
    // Cleanse fileName.
    fileName = Path.GetFileName(fileName);
Run Code Online (Sandbox Code Playgroud)

GetFileName方法从路径中删除所有目录信息,这正是您要在此处执行的操作.

输入如下:

..\..\..\filename.ext
Run Code Online (Sandbox Code Playgroud)

你会得到:

filename.ext
Run Code Online (Sandbox Code Playgroud)

作为回报,您不必担心有人会注入一个会逃避您所定位目录的路径(假设此文件名是用户输入的,或者来自开放端点,其中有人可以输入他们想要的任何输入).

然后,您可以将自定义路径追加到fileName.

只有当你的所有文件都在一个预定义的目录中时,这才有效.

但是,这并不能处理删除用户无权访问的文件.如果文件属于该目录中的另一个用户,那么这里没有检查是否是这种情况(但是如果所有用户都有权删除这些文件,那么没关系).

此外,您可能希望使用类上的Combine方法Path来组合路径,如下所示:

string path = Server.MapPath(@"~\docs\custFiles\")
path = Path.Combine(path, year);
path = Path.Combine(path, cNum);
path = Path.Combine(path, fileName);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是.NET 4.0或更高版本,则可以使用将路径部分作为参数数组Combine方法的重载:

string path = Path.Combine(
    Server.MapPath(@"~\docs\custFiles\"),
    year, cNum, fileName);
Run Code Online (Sandbox Code Playgroud)

最后,正如Shai指出的那样,如果可能(对于完整的解决方案),为了使这更加安全,您应该在文件系统级别启用权限.

如果您模拟用户或使用受约束的用户帐户来处理所有请求,则应该授予该用户仅访问~\docs\custFiles\目录(以及任何子目录)的权限 .

用户帐户应该无权访问该目录之上的任何内容.