在我的应用程序中,当用户上传或下载文件时,我会构建一个静态字符串。在该字符串中,文件名是从该字符串中的前端传递的。通过这种方式,用户可以执行诸如 ..\..\another file.file 之类的操作来篡改并从其他用户那里获取数据。因此,我需要过滤我得到的文件名以防止这种情况。哪些字符需要过滤以防篡改?我现在有双点和反斜杠和正斜杠。还有什么我应该考虑的吗?在 C# 中是否有标准的方法可以做到这一点?
问问题
220 次
2 回答
2
如果不同的用户使用相同的名称保存文件怎么办?您是否为每个用户创建一个文件夹?
您很可能应该做的是将它们提供的名称存储在数据库记录中,该记录还包含指向实际文件的指针(该文件使用您生成的文件名,可能是 guid)。如果您还想将文档保存在数据库中,也可以考虑使用文件流数据类型。
让您的用户确定您服务器上的文件名并没有什么好处:)
于 2012-04-22T08:44:12.430 回答
2
我建议使用Path.GetInvalidFileNameChars
:
public static bool IsValidFileName(string fileName)
{
return fileName.IndexOfAny(Path.GetInvalidFileNameChars()) == -1;
}
..
通常只有在 a\
或之前和/或之后才是危险的/
,这两者都包含在 . 返回的数组中GetInvalidFileNameChars
。它本身..
是无害的(除非您专门解析目录路径),并且您不应该禁止它,因为人们可能希望在他们的文件名中引入省略号(例如The A...Z of Programming.pdf
)。
于 2012-04-22T08:35:23.317 回答