验证文件是它声称的文件扩展名
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,以使其通过初始打开对话框验证。
这是一个相当简单的例子。这些文件由服务器使用,我只想确保不会上传不起作用的文件。
我查看了NSFileManager
attributeOfItems: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】:基本上没有。文件系统只知道关于文件的一些非常有限的事情。可以有更多相关联的元数据,但在许多情况下不会有 - 在任何情况下,元数据都可能存在。如果您想确定一个文件确实包含它声称的内容,您需要打开它并查看。
根据文件类型和信任级别,您可能不必查看全部内容。例如,文件的第一个字节中可能有一个幻数,或者可能有其他标题信息足以说服您。但他们的存在并不能保证文件会“工作”。
【讨论】:
然后打开它的文件头。 :-( 但至少这是一个解决方案。以上是关于验证文件是它声称的文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章