我工作的应用程序具有文件上载功能。我们最近发现,用户能够上传一些文件,这些文件的文件名带有不可见的无效字符。在VS调试器中,它显示为问号,在SQL Server中,存储文件名,它显示为管道符号。关于非技术用户如何意外保存具有这种文件名的文件的任何想法?
答案 0 :(得分:1)
一个可能的原因(我亲自体验过):
这是因为Windows存在该对话框:
如您所见,仍然有一个代码页,可以更改。在那里没有提及,但它也适用于文件系统。更改后,文件名中使用的某些字符可能会更改或变为非法。你可以在你的机器上测试它。创建一个文件ľščťžýáíé.txt
(复制粘贴名称以进行测试),然后更改文件系统编码(您可以使用上面显示的两个,当我上次尝试时问题可以与它们重现)并检查文件名。我还确认在进行此类更改后,包含某些此类字符的文件名甚至无法打开,直到您将编码还原为原始编码为止。
因此,不要假设用户使用与服务器(或应用程序)使用的文件系统代码页相同的文件系统代码页来上载文件。这是一个错误的假设。
MSDN says:
NTFS以Unicode格式存储文件名。相反,旧的FAT12,FAT16和FAT32文件系统使用OEM字符集。有关更多信息,请参阅代码页。
因此,一些问题可能源于文件系统编码。一些来自您如何处理加工链中的国家字符。 您是否在上传到下载的过程中测试了系统中是否保留了所有Unicode字符?
顺便问一下,您在数据库中使用的是UTF-8代码页吗?
你是否在文字中正确引用了UTF-8字符串?即每当字符串包含7位ASCII范围之外的字符,即N'štring'
时,使用'štring'
而不是AscW(c) >= 128
。 A-Z,a-z的时代已经结束,甚至美国开发商也必须正确处理国际化。
答案 1 :(得分:-2)
我认为他们只是键入了管道字符#34; | "在文件名中如: 例如| FILENAME.TXT
由于管道是分隔符,因此可能会被视为可能的黑客攻击。
我使用过多种语言的代码VB,SQL,C#,在使用它们之前解析文件名。