3

我有这个将文件存储到服务器的代码:

function void StoreFile(string inputFileName) {
   ...

   var extension = Path.GetExtension(inputFileName);
   if(extension == ".csv") {
       var fileName = string.Format("{0}_{1}{2}", Session.SessionID, new Guid(), extension);

       var dataFileServerPath = _documentService.getPath(fileName, UserProfile.UserName, UserProfile.SourceID);

       if(!string.IsNullOrEmpty(dataFileServerPath)) {
           try {
              using(FileStream dataFile = new FileStream(dataFileServerPath, FileMode.Create))  { .... }
           }
           cathc(Exception e) { ... }    
       }
    }    
    else {
        throw new NotSupportedFormatError();
    }
}

在 Veracode 分析之后,我在线获得了目录遍历问题FileStream dataFile = new FileStream(dataFileServerPath, FileMode.Create)

为什么我会出现这个问题,我检查了文件扩展名是否对我的案例有效,并在 fileName.xml 中传递了该值。这是安全问题吗?如何解决这个问题?

_documentService.getPath只是为特定用户附加来自 web.config 的路径和文件名,它与用户输入无关。

4

2 回答 2

5

根据您在此处发布的代码,这看起来像是误报。

Veracode 显然正在跟踪inputFileName变量(我假设它包含未经验证的用户输入),并指出它会影响extension变量。由于您后来extension直接嵌入到文件名中,并读取了指向的文件,Veracode 发现恶意用户可能会在 inputFileName 中嵌入部分路径,然后更改目标文件的目录......

在这种情况下,Veracode 缺少您已经执行输入验证(检查)的事实extension == ".csv",并且绝对将输入的相关部分限制在严格的白名单中。

假设您的问题中没有缺少其他相关代码位,则可以安全地将其标记为误报。

于 2015-08-25T13:21:59.480 回答
4

静态分析器没有真正的方法来可靠地验证您实际上没有使用用户输入。他们往往会因过于谨慎而犯错,从而产生误报。

于 2015-08-25T13:22:46.907 回答