我接受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 > 2^24"/>
我当前的用户输入验证是查看所有的内容类型,如果从“Encrypt”向下的计数是!= 0,则拒绝PDF。 我相信,有时当人们点击“打印到pdf”时,取决于使用的转换软件,有时会添加一些内容类型。因此,我目前拒绝pdf,即使可疑的内容类型实际上是无辜的。当然,我没有办法来确定是否JS是无辜的,但我想解除JS和继续与文件。 有没有一种方法,我可以采取一个PDF在内存然后自动解除/拆除它,覆盖以前的文件?我想做这样的事情
SuspectPDF = request.FILES['docfile'][0]
CleanPDF = disarmPDF(SuspectPDF)
我知道PDFiD有一个解除功能,但是我不确定它是否能够完成我在内存中想要的功能。我很想知道是否还有其他更常用的用户输入PDF验证解决方案,以及是否还有其他需要注意的事项。 问题来源StackOverflow 地址:/questions/59382994/best-way-to-disarm-user-uploaded-pdfs
最好的方法是提取你需要的所有内容、标记和说明(文本、图像、表单数据、注释、字体等),然后扔掉pdf。 基于关键字的解决方案将不会工作,因为每个(甚至可能武装)PDF肯定会有一些关键字(如xref, obj/endobj等),并可能没有其他一些。参见PDF规范文件和文档结构,不同的说明等。 如果你使用python的内容提取看看包:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。