https://security-code-scan.github.io/
在构建期间会显示Visual Studio中的安全扫描SCS 0018警告。目前,我正在努力删除这些警告。我尝试了几个MSDN站点,但是没有运气。我也阅读了OWSAP,但它们与C#并没有明确的关系。请找到“路径遍历”警告的图像。
代码:
public void Move(string sourceFileName, string destinationFileName) { try { System.IO.File.Move(sourceFileName,destinationFileName); } catch (System.Exception e) { } }
答案 0 :(得分:1)
首先试试5.0.0版本,它的不可信输入跟踪功能更好,这种情况下可能不会给你警告。
如果它仍然给您警告,您需要正确验证或清理不受信任的参数。但是 SCS 不够智能,无法识别自定义验证函数,因此您需要将其添加到 configuration file 中,例如:
Sanitizers:
- Type: NamespaceAndClassName
TaintTypes:
- SCS0018
Methods:
- Name: SanitizePath
有关更多消毒剂示例,请参阅 the built-in configuration。
如果您不想使用专用函数,而是内联对其进行验证,则另一个选项是 suppress the warning。
答案 1 :(得分:0)
您应该阅读有关此警告的文档以了解问题并找到相关参考资料。
<块引用>路径遍历攻击(也称为目录遍历)旨在访问存储在预期目录之外的文件和目录。变体或使用绝对文件路径,可以访问存储在文件系统上的任意文件和目录,包括应用程序源代码或配置和关键系统文件。
https://security-code-scan.github.io/#SCS0018
您的代码的问题在于您接受并使用了 destinationFileName
参数而没有进行任何类型的检查。
System.IO.File.Move(sourceFileName,destinationFileName);
文档提供了建议(在使用参数之前检查无效的文件名字符并抛出异常)并且 .NET Core 提供了一种新类型 PhysicalFileProvider,可以防止路径遍历。
<块引用>PhysicalFileProvider 提供对物理文件系统的访问。 PhysicalFileProvider 使用 System.IO.File 类型(用于物理提供程序)并将所有路径限定为一个目录及其子目录。此作用域可防止访问指定目录及其子目录之外的文件系统。
但是,我不知道 SCS 是否正确检测到这种类型的使用。