繁体   English   中英

解除用户上传的 PDF 的最佳方法

[英]Best way to disarm user-uploaded PDFs

我接受 PDF 作为用户输入。 我知道上传的 PDF 不应该/不需要包含任何可能被恶意使用的内容类型,如 JS 或 AA。 例如,这是一个干净的 PDF 应该具有的(使用 Didier Stevens PDFiD检查):

    <Keyword Count="59" HexcodeCount="0" Name="obj"/>
    <Keyword Count="59" HexcodeCount="0" Name="endobj"/>
    <Keyword Count="19" HexcodeCount="0" Name="stream"/>
    <Keyword Count="19" HexcodeCount="0" Name="endstream"/>
    <Keyword Count="2" HexcodeCount="0" Name="xref"/>
    <Keyword Count="2" HexcodeCount="0" Name="trailer"/>
    <Keyword Count="2" HexcodeCount="0" Name="startxref"/>
    <Keyword Count="12" HexcodeCount="0" Name="/Page"/>
    <Keyword Count="0" HexcodeCount="0" Name="/Encrypt"/>
    <Keyword Count="0" HexcodeCount="0" Name="/ObjStm"/>
    <Keyword Count="0" HexcodeCount="0" Name="/JS"/>
    <Keyword Count="0" HexcodeCount="0" Name="/JavaScript"/>
    <Keyword Count="0" HexcodeCount="0" Name="/AA"/>
    <Keyword Count="0" HexcodeCount="0" Name="/OpenAction"/>
    <Keyword Count="0" HexcodeCount="0" Name="/AcroForm"/>
    <Keyword Count="0" HexcodeCount="0" Name="/JBIG2Decode"/>
    <Keyword Count="0" HexcodeCount="0" Name="/RichMedia"/>
    <Keyword Count="0" HexcodeCount="0" Name="/Launch"/>
    <Keyword Count="0" HexcodeCount="0" Name="/EmbeddedFile"/>
    <Keyword Count="0" HexcodeCount="0" Name="/XFA"/>
    <Keyword Count="0" HexcodeCount="0" Name="/Colors &gt; 2^24"/>

我当前的用户输入验证是查看所有内容类型,如果从“加密”向下计数为 != 0,则拒绝 PDF。

我相信有时当人们点击“打印到 pdf”时,取决于使用的转换器软件,有时会添加其中一些内容类型。 所以我目前拒绝 PDF,即使可疑内容类型实际上是无辜的。 当然,我无法确定 JS 是否无辜,但我想解除 JS 并继续处理文件。

有没有一种方法可以让我在内存中保存一个 PDF,然后自动解除/解除它,覆盖以前的文件? 我想做这样的事情

SuspectPDF = request.FILES['docfile'][0]
CleanPDF = disarmPDF(SuspectPDF)

我知道 PDFiD 具有解除武装功能,但我不确定它能否在内存中完成我想要的操作。 我很想知道是否还有其他更常用的用户输入 PDF 验证解决方案,以及这里是否还有其他需要注意的事项。

最好的方法是提取您需要的所有内容、markdown 和说明(文本、图像、表单数据、注释、字体等)并将 pdf 扔掉。

基于关键字的解决方案将不起作用,因为每个(甚至可能武装的)PDF 肯定会有一些关键字(如外部参照、obj/endobj 等)并且可能没有其他一些关键字。 请参阅有关文件和文档结构、不同说明等的PDF 规范

如果您使用 python 进行内容提取,请查看软件包:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM