3

Visual Studio 中的安全扫描 SCS0018 警告在构建期间显示。目前,我正在努力消除这些警告。我尝试了几个 MSDN 站点,但没有运气。我也读过 OWSAP,但它们与 C# 没有明确的关系。请找到路径遍历警告的图像。

路径遍历警告消息

代码:

   public void Move(string sourceFileName, string destinationFileName)
    {
        
        try
        {
            System.IO.File.Move(sourceFileName,destinationFileName);
        }
        catch (System.Exception e)
        {
        }
   }
4

2 回答 2

1

首先,尝试一下 5.0.0 版本,它有更好的不可信输入跟踪,在这种情况下可能不会给你警告。

如果它仍然给您警告,您需要正确验证或清理不受信任的参数。但是 SCS 不够智能,无法识别自定义验证功能,因此您需要将其添加到配置文件中,例如:

Sanitizers:
  - Type: NamespaceAndClassName
    TaintTypes:
      - SCS0018
    Methods:
      - Name: SanitizePath

有关更多消毒剂示例,请参阅内置配置

相反,如果您不希望有一个专用函数,而是内联验证它,另一个选项是抑制警告

于 2021-03-02T10:39:24.190 回答
0

您应该阅读有关此警告的文档以了解问题并找到相关参考。

路径遍历攻击(也称为目录遍历)旨在访问存储在预期目录之外的文件和目录。通过使用“点-点-斜线 (../)”序列及其变体来操作引用文件的变量或通过使用绝对文件路径,可以访问存储在文件系统上的任意文件和目录,包括应用程序源代码或配置和关键系统文件。

https://security-code-scan.github.io/#SCS0018

您的代码的问题是您接受并使用该destinationFileName参数而没有任何检查。

System.IO.File.Move(sourceFileName,destinationFileName);

该文档提供了一个建议(在使用参数之前检查无效的文件名字符并引发异常),并且 .NET Core 提供了一种新类型PhysicalFileProvider,可以防止路径遍历。

PhysicalFileProvider 提供对物理文件系统的访问。PhysicalFileProvider 使用 System.IO.File 类型(用于物理提供程序)并将所有路径限定为目录及其子目录。此范围可防止访问指定目录及其子目录之外的文件系统。

但是,我不知道 SCS 是否正确检测到这种类型的使用。

于 2020-12-31T21:10:48.663 回答