验证文件是它声称的文件扩展名

Posted

技术标签:

【中文标题】验证文件是它声称的文件扩展名【英文标题】:Validating a file is what it claims to be by it's file extension 【发布时间】:2011-02-02 21:02:08 【问题描述】:

有没有办法根据文件扩展名验证文件是它声称的内容?

我的应用程序将大量文件复制到远程服务器。在进行每个文件复制之前,我想验证该文件实际上是文件扩展名所声称的。

现在用户使用NSOpenPanel 选择文件和/或文件目录。一旦我有了一组文件,我就可以在复制开始之前验证每个文件的物理存在。我已经验证源目录是可写的,工作正常,使用FSCopyObjectAsync 并取消所有文件的副本也工作正常。

最后一部分是这个验证检查。我的用户可以上传的内容受到限制,但过滤器是使用文件扩展名完成的。例如,恶意用户可以获取一个 word 文档文件(文件扩展名为 .doc)并将其更改为 .png,以使其通过初始打开对话框验证。

这是一个相当简单的例子。这些文件由服务器使用,我只想确保不会上传不起作用的文件。

我查看了NSFileManagerattributeOfItems:atPath:,但它似乎没有提供任何关于真实文件类型的信息。文件类型只返回目录、符号链接等。

我宁愿不尝试打开并加载每个文件进行验证,只需读取文件头并检查它是否符合所需的任何文件类型规范。

这不是 ios 应用。

非常感谢任何和所有正确方向的帮助或指示。

【问题讨论】:

【参考方案1】:

您可以使用 libmagic 或 MagicKit,这是一个围绕 libmagic 的 Objective-C 包装器。 MagicKit 可以返回给定文件的 UTI 或 MIME 类型。

【讨论】:

感谢 Bavarious,尽管这可能有效,但我们使用第三方软件会产生商业运输影响。所以这将是一个非首发(尽管它可能会在未来的一些项目中发挥作用) Bavarious - 我收回了。 MagicKit 已获得 MIT 许可,因此可以正常工作。会检查并通知您。【参考方案2】:

您可以尝试在其上运行 /usr/bin/file --mime 以获取 MIME 类型。

【讨论】:

凯文 - 值得一试,但没有运气。我将 jpg 重命名为 png 并且 --mime 现在将其报告为 png 而不是 jpg。好主意。【参考方案3】:

基本上没有。文件系统只知道关于文件的一些非常有限的事情。可以有更多相关联的元数据,但在许多情况下不会有 - 在任何情况下,元数据都可能存在。如果您想确定一个文件确实包含它声称的内容,您需要打开它并查看。

根据文件类型和信任级别,您可能不必查看全部内容。例如,文件的第一个字节中可能有一个幻数,或者可能有其他标题信息足以说服您。但他们的存在并不能保证文件会“工作”。

【讨论】:

然后打开它的文件头。 :-( 但至少这是一个解决方案。

以上是关于验证文件是它声称的文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

上传文件前验证文件扩展名

通过php验证没有扩展名的xls文件

使用 python 验证文件扩展名 [重复]

是否可以在上传前同时验证文件大小和扩展名?

使用 Angular 进行多文件扩展名验证

如何在perl中验证具有给定文件扩展名的多个文件