CAT.NET“在将文件路径传递到文件系统例程之前对其进行清理”消息
-
22-09-2019 - |
题
我正在使用 CAT.NET 代码分析来分析我的代码(C#、桌面应用程序),并在处理文件名时收到“在将文件路径传递到文件系统例程之前对其进行清理”消息。我不明白的是,为了确保文件名有效,我使用:
void SomeMethod(String filename)
{
filename = System.IO.Path.GetFullPath(filename);
// ... Do stuff
}
这不是解决无效文件名问题的“神奇解决方案”吗?我读过类似的东西 这里 (第一个答案),但就我而言,我只处理本地文件,嗯,一些非常基本的东西,所以......
那么为什么我会收到此消息以及如何避免收到此消息?
解决方案
我知道这是一个老问题,但我刚刚遇到了一些与 CAT.Net 错误消息相关的问题,可能会有所帮助。
在一个 博客文章 关于 CAT.Net 数据流规则,他们有这样的说法 FileCanonicalizationRule
:
描述
文件处理例程中使用的用户输入可能会导致文件规范化漏洞。如果代码根据将其作为输入传递给程序的资源的名称做出任何决定,则特别容易受到规范化问题的影响。文件,路径和URL是容易受到规范化的资源类型,因为在每种情况下,都有许多不同的方式来表示同名。
解决
在将文件路径传递给文件处理例程之前对其进行清理。使用PATH.GETINVALIDFILENAMECHARS或PATH.GETINVALIDPATHARS获取无效的字符并将其从输入中删除。可以在 http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx.
因此,他们建议您使用 Path.GetInvalidFileNameChars
和 Path.GetInvalidPathChars
验证您的路径。
请注意,他们的建议是 消除 无效字符。虽然这确实会使路径有效,但可能会导致用户出现意外行为。正如评论中的 这 问题/答案表明,最好尽早退出并告诉用户他们的路径无效,而不是对他们的输入做一些意想不到的事情(例如删除坏字符和使用修改后的版本)。
其他提示
如果文件名是来自用户,也可能是像“../../../../etc/passwd” - 错误消息告诉你,你需要消毒,以便它可以“吨得到到目录它不应该。