【问题标题】:PDF and DOCX Magic NumbersPDF 和 DOCX 幻数
【发布时间】:2015-11-17 15:48:03
【问题描述】:

我读取第一个字节以区分文件类型,但 PDF 和 DOCX 都有一个“0x50”幻数。这种情况该如何处理?

【问题讨论】:

  • 为什么不使用文件扩展名?
  • 我太笨了,我只是让事情变得复杂。非常感谢您对我有所了解! :)
  • @Oscar 因为即使不是 PDF,您也可以重命名文件 something.pdf;这不会使它成为PDF,只会使它成为扩展名为“.pdf”的文件;魔法检测增加了额外的健全性检查。我使用的系统必须处理不同的图像类型,我无法通过 PDF 进程发送 JPEG,否则它会损坏,因此会出现魔法检测。
  • @JoshDM 如果在我的系统中,我希望 pdf 文件具有 pdf 扩展名,而您向我发送带有 pdf 扩展名的 jpg,我会在它抛出错误时立即丢弃它。当然,你可以尝试使用幻数和类似的技巧,但我个人更喜欢坚持 KISS 原则。

标签: pdf upload byte docx magic-numbers


【解决方案1】:

似乎 PDF 有多个签名。某些类型的 PDF 以这 8 个字节结尾

0A 0D 0A 30 0D 0A 0D 0A

【讨论】:

  • 在当前软件中,在 %PDF 之前或 %%EOF 之后放置任何内容都可能被视为错误(除非 pdf 不用于分发,而仅用于某些特殊的打印机队列)。
  • 这些 PDF 以电子邮件附件的形式出现,我们检查它们与格式的一致性并将它们转换成 PDF(当它已经是 pdf 时可能会绕过它)并存储。然后可以在浏览器中显示它们
【解决方案2】:

PDF 文件没有以它们开头的“魔术”字节。如果您阅读 PDF 规范,您会发现它们必须以“%PDF”开头,但实际上许多 PDF 文件并非如此。

1) 仅仅寻找 %PDF 标头来识别 PDF 文件是非常不可靠的,有效的 PDF 文件是您可以解析的文件(至少有一个预告片、交叉引用表等)。

2) 曾经有人建议 PDF 文件在 %PDF 标头之前包含二进制数据,以确保它们被视为二进制文件。结果,PDF 阅读器在某一时刻开始在 %PDF 标头之前接受一定数量的二进制字节(随机字节)。此类文件无法通过简单的幻数或幻数字符串检测到。

【讨论】:

  • [需要引用] 对于您的大多数不寻常的声明。 Hugo 的引用表明 %PDF 非常标准。
  • 参见(例如)Adobe Systems 的 PDF 版本 1.3 的 PDF 参考第二版中的实施说明 13:“13. Acrobat 查看器只要求标题出现在文件的前 1024 个字节内的某处."。是的,这是一个旧文档,但它仍然是全球使用的大部分 PDF 标准的基础。此外,我从 1997 年开始编写了主要商业 PDF 预检软件的第一个版本。相信我,我不寻常的说法是正确的。
  • 虽然这是一个不寻常的声明,但我有一堆用crawfordtech.com/products/enterprise-output-management/pro-pdf 制作的 PDF,开头有大约 50 个看似随机的字节。不过,它们在每个文件中都是相同的字节。
  • @Jayen 在当前软件中将任何内容放在 %PDF 之前或 %%EOF 之后都可以被视为错误(除非 pdf 不用于分发,而仅用于某些特殊的打印机队列) .
【解决方案3】:

这很奇怪,因为我看到 PDF 文件为 0x25,DOCX 文件为 0x50 ... (source 1source 2)。 但是,当您在文本模式下以 ISO 8859-1 编码打开这些文件时,您仍然可以看到 DOCX 文档以“PK”开头,而 PDF 文档将以“%PDF”开头。

希望对您有所帮助!雨果。

【讨论】:

    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2017-05-24
    • 2011-03-18
    • 2021-12-22
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多