CAT.NET“在将文件路径传递给文件系统例程之前清理文件路径”消息

时间:2009-12-31 07:43:51

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

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

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

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

那么为什么我收到这条消息以及如何避免得到它呢?

2 个答案:

答案 0 :(得分: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问题/答案的评论表明,提前退出并告诉用户他们的路径无效,而不是对他们的输入做出意外的事情(比如删除不良字符和使用修改后的版本)可能更好。< / p>

答案 1 :(得分:0)

如果文件名来自用户,则可能是“../../../../etc/passwd” - 错误消息告诉您需要对其进行消毒以便它可以不要去目录。