【发布时间】:2010-10-22 13:25:37
【问题描述】:
我正在尝试更改我们在将上传文件存储到磁盘之前处理它们的方式。当来自非 Windows 操作系统的用户上传带有非法 Windows 文件名字符的文件时,我们遇到了一些问题。
我心中的理想主义者告诉我,文件名应该尽可能靠近 Web 层合法。因此,我们在整个业务逻辑和数据层中使用相同的正确文件名。 在实践中,这需要我们主动清理多个位置的文件名,然后稍后再信任它。这是一个问题,因为它更容易出现程序员错误,除非您只有一个来自网络的文件的入口点。
-
我看到的另一个选项是使用文件名上的清理方法来包装文件 IO。这是不可能的,因为我们有时需要将文件名存储在数据库中。如果文件名在存储到磁盘之前未更改,则 DB 将包含错误的文件名。如果对文件系统的所有调用都通过相同的文件名清理方法,这同样无关紧要,只是实际上您的运营部门有时会希望通过从 DB 中读取文件名来执行一些脚本化的工作来移动文件。
绕过选项二的一种方法是,如果新文件名被卫生设施更改,则返回新文件名。这要求该方法的用户意识到这一点并正确处理它。像这样:
public static FileStream CreateFile(string filename, out string newFileName)
{
newFileName = FileNameSanitiser.GetSanitisedFullPath(filename);
return System.IO.File.Create(newFileName);
}
关于选项 1,我们应该只有一个或两个文件上传端点。这将使该选项更加可行。我认为在这方面投入时间可能值得,但我不确定我的经理是否同意……
【问题讨论】:
标签: c# architecture file-io input validation