在 Python 中清理 PDF 用户输入
Sanitizing PDF user input in Python
我的应用程序允许用户上传 PDF 文件。这些文件应该看起来相对相似并且是相同格式的变体。我了解 PDF 有时可能包含恶意内容——例如Javascript 在 Adobe Reader 或类似软件中打开时将执行。
我在网上看到了一些软件包,例如 PDFiD,它可以帮助您查看可能有问题的 PDF。这似乎允许您查看所有底层内容类型。我目前的想法是了解我的文档应该包含哪些内容类型,然后在文件包含异常内容时阻止文件上传。
有没有一种简单的方法可以使用 Python 自动清除 PDF 中的恶意内容,删除其中可能包含的所有可执行代码?我知道有一种 PDF/A 格式允许这样的事情,但是有没有像 PyPDF2 这样具有清理功能的包?
我相信这就是答案:
from pdfid import PDFiD
new_file = PDFiD('path/to/file', disarm=True)
将采用 PDF 的元素
<Keywords>
<Keyword Count="56" HexcodeCount="0" Name="obj"/>
<Keyword Count="56" HexcodeCount="0" Name="endobj"/>
<Keyword Count="32" HexcodeCount="0" Name="stream"/>
<Keyword Count="32" HexcodeCount="0" Name="endstream"/>
<Keyword Count="1" HexcodeCount="0" Name="xref"/>
<Keyword Count="1" HexcodeCount="0" Name="trailer"/>
<Keyword Count="1" HexcodeCount="0" Name="startxref"/>
<Keyword Count="8" 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"/>
</Keywords>
如果可疑就让一切计数=0
我的应用程序允许用户上传 PDF 文件。这些文件应该看起来相对相似并且是相同格式的变体。我了解 PDF 有时可能包含恶意内容——例如Javascript 在 Adobe Reader 或类似软件中打开时将执行。
我在网上看到了一些软件包,例如 PDFiD,它可以帮助您查看可能有问题的 PDF。这似乎允许您查看所有底层内容类型。我目前的想法是了解我的文档应该包含哪些内容类型,然后在文件包含异常内容时阻止文件上传。
有没有一种简单的方法可以使用 Python 自动清除 PDF 中的恶意内容,删除其中可能包含的所有可执行代码?我知道有一种 PDF/A 格式允许这样的事情,但是有没有像 PyPDF2 这样具有清理功能的包?
我相信这就是答案:
from pdfid import PDFiD
new_file = PDFiD('path/to/file', disarm=True)
将采用 PDF 的元素
<Keywords>
<Keyword Count="56" HexcodeCount="0" Name="obj"/>
<Keyword Count="56" HexcodeCount="0" Name="endobj"/>
<Keyword Count="32" HexcodeCount="0" Name="stream"/>
<Keyword Count="32" HexcodeCount="0" Name="endstream"/>
<Keyword Count="1" HexcodeCount="0" Name="xref"/>
<Keyword Count="1" HexcodeCount="0" Name="trailer"/>
<Keyword Count="1" HexcodeCount="0" Name="startxref"/>
<Keyword Count="8" 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"/>
</Keywords>
如果可疑就让一切计数=0