【问题标题】:CAT.NET "Sanitize the file path prior to passing it to file system routines" messageCAT.NET“在将文件路径传递给文件系统例程之前对其进行清理”消息
【发布时间】:2009-12-31 07:43:51
【问题描述】:

我正在使用 CAT.NET 代码分析分析我的代码(C#、桌面应用程序),并在处理文件名时收到“在将文件路径传递给文件系统例程之前对其进行清理”消息。 我不明白的是,为了确保文件名有效,我使用:

void SomeMethod(String filename)
{
    filename = System.IO.Path.GetFullPath(filename);
    // ... Do stuff
}

解决无效文件名问题难道不是一个“神奇的解决方案”吗?我读过类似的东西here(第一个答案),但就我而言,我只处理本地文件,嗯,一些非常基本的东西,所以......

那么为什么我会收到此消息以及如何避免收到此消息?

【问题讨论】:

    标签: code-analysis filenames sanitization canonicalization cat.net


    【解决方案1】:

    我知道这是一个老问题,但我刚刚遇到了一些与 CAT.Net 错误消息特别相关的内容。

    在关于 CAT.Net 数据流规则的blog post 中,他们对FileCanonicalizationRule 有这样的说法:

    说明

    文件处理例程中使用的用户输入可能会导致 文件规范化漏洞。代码特别容易受到影响 如果它根据名称做出任何决定,则针对规范化问题 作为输入传递给程序的资源。文件、路径、 URL 是易受规范化影响的资源类型 因为在每种情况下都有许多不同的方式来表示 同名。

    分辨率

    在将文件路径传递给文件处理例程之前对其进行清理。 使用 Path.GetInvalidFileNameChars 或 Path.GetInvalidPathChars 获取 无效字符并将其从输入中删除。更多的 信息可以在 http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx.

    因此,他们建议您使用Path.GetInvalidFileNameCharsPath.GetInvalidPathChars 来验证您的路径。

    请注意,他们的建议是删除无效字符。虽然这确实会使路径有效,但可能会导致用户出现意外行为。正如this question/answer 上的 cmets 建议的那样,最好尽早退出并告诉用户他们的路径无效,而不是对他们的输入做一些意想不到的事情(比如删除坏字符并使用修改后的版本)。

    【讨论】:

      【解决方案2】:

      如果文件名来自用户,它可能类似于“../../../../etc/passwd” - 错误消息告诉您需要对其进行清理以便它可以'不要访问它不应该访问的目录。

      【讨论】:

      • 这正是我使用 Path.GetFullPath 的原因,它将像“C:\SomeStuff\ChildDirectory\..\..\FileHere.txt”这样的路径转换为“C:\FileHere.txt” .
      • 如果用户输入了路径,这将带来巨大的安全风险——他们可能会访问/覆盖不应被允许接触的目录中的文件。在您的示例中,您假设文件将位于“C:\SomeStuff\ChildDirectory”中,但实际上他们正在访问“C:\”中的文件。
      • 我真的不明白。 Path.GetFullPath("C:\SomeStuff\ChildDirectory\..\..\FileHere.txt") 给出“C:\FileHere.txt”。因此,通过在每个方法的开头(需要时)调用 GetFullPath() 并使用其结果,我是安全的。还是不行?
      • 如果您只是使用用户提供的文件名调用 GetFullPath,则您允许用户访问机器上的 任何 路径,而不仅仅是他们应该访问的路径。例如,假设您的应用程序允许用户上传图像,并使用用户指定的名称将它们存储到 c:\MyApp\Images。他们指定名称“..\..\Windows\explorer.exe”并用木马覆盖 C:\Windows\explorer.exe。因此,您需要清除诸如“..\”之类的内容,而不仅仅是将它们接受到 GetFullPath() 中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2020-09-23
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多