【问题标题】:How can a Windows file have invalid hidden charactersWindows 文件如何包含无效的隐藏字符
【发布时间】:2017-04-09 18:21:43
【问题描述】:

我使用的应用程序具有文件上传功能。我们最近发现,用户能够上传几个文件名包含不可见无效字符的文件。在 VS 调试器中,它显示为问号,而在存储文件名的 SQL Server 中,它显示为管道符号。关于非技术用户如何意外保存具有此类文件名的文件的任何想法?

【问题讨论】:

  • 可能是复制粘贴作业。这些不寻常的人物有一种出现在互联网上各个地方的方式。不过,我不知道您为什么得出该角色“无效”的结论。它更有可能是一个 Unicode 字符,您没有正确的字形来显示。如果它实际上是无效,如底层文件系统不支持,你应该得到一个错误。显而易见的解决方案是清理输入,包括文件名。但没有理由对此过于热心,因为这里似乎一切工作正常

标签: visual-studio filenames


【解决方案1】:

一个可能的原因(我自己经历过):

另一台机器上的文件系统有不同的编码。

这是自从该对话框存在以来的Windows:

如您所见,仍然有一个代码页,它可以更改。此处未提及,但它也适用于文件系统。 更改后,文件名中使用的某些字符可能会更改或变为非法字符。你可以在你的机器上测试它。创建一个文件ľščťžýáíé.txt(复制粘贴名称以进行测试),然后更改文件系统编码(您可以使用上面可见的两个,当我前段时间尝试时,问题可以重现)并检查文件名.我还确认包含某些此类字符的文件名在进行此类更改后甚至无法打开,直到您将编码恢复为原始编码。

因此,不要假设用户上传的文件与您的服务器(或应用程序)使用的文件系统代码页相同。这是一个错误的假设。

MSDNsays:

NTFS 以 Unicode 格式存储文件名。相反,较旧的 FAT12、FAT16 和 FAT32 文件系统使用 OEM 字符集。有关详细信息,请参阅代码页。

所以有些问题可能源于文件系统编码。一些来自您在处理链中处理国家字符的方式。 您是否测试过您的系统在从上传到下载的过程中保留所有 Unicode 字符?

顺便问一下,您在数据库中使用 UTF-8 代码页吗?

您是否在文字中正确引用了 UTF-8 字符串? IE。只要字符串包含 7 位 ASCII 范围之外的字符,即AscW(c) >= 128,则使用N'štring' 而不是'štring'。 A-Z、a-z 的时代已经结束,即使是美国的开发者也必须正确处理国际化。

【讨论】:

    【解决方案2】:

    我认为他们只是在文件名中键入了管道字符“|”,例如: 示例|文件名.txt

    由于管道是分隔符,这将被视为可能的黑客攻击。

    我使用过多种语言 VB、SQL、C# 的代码,这些代码在使用它们之前会解析文件名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多