2

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

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

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

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

4

2 回答 2

1

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

一篇关于 CAT.Net 数据流规则的博客文章中,他们有这样的说法FileCanonicalizationRule

描述

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

解析度

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

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

请注意,他们的建议是删除无效字符。虽然这确实会使路径有效,但可能会导致用户出现意外行为。正如对这个问题/答案的评论所暗示的,最好尽早退出并告诉用户他们的路径无效,而不是对他们的输入做一些意想不到的事情(比如删除坏字符和使用修改后的版本)。

于 2012-03-21T19:24:55.677 回答
0

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

于 2009-12-31T07:50:09.823 回答