我正在使用CAT.NET代码分析分析我的代码(C#,桌面应用程序),并在处理文件名时获取“在将文件路径传递给文件系统例程之前清理文件路径”消息。 我不明白的是,为了确保文件名有效,我使用:
void SomeMethod(String filename)
{
filename = System.IO.Path.GetFullPath(filename);
// ... Do stuff
}
解决无效文件名问题不是一个“神奇的解决方案”吗?我读过类似的here(第一个答案),但在我的情况下,我只处理本地文件,嗯,非常基本的东西,所以......
那么为什么我收到这条消息以及如何避免得到它呢?
答案 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.GetInvalidFileNameChars
和Path.GetInvalidPathChars
来验证您的路径。
请注意,他们的建议是删除无效字符。虽然这确实会使路径有效,但它可能会导致用户出现意外行为。由于对this问题/答案的评论表明,提前退出并告诉用户他们的路径无效,而不是对他们的输入做出意外的事情(比如删除不良字符和使用修改后的版本)可能更好。< / p>
答案 1 :(得分:0)
如果文件名来自用户,则可能是“../../../../etc/passwd” - 错误消息告诉您需要对其进行消毒以便它可以不要去目录。