如何使用Python检测PDF文件是否包含JavaScript、PostScript等活动内容?
如何用Python检测PDF中的JavaScript和PostScript活动内容
嘿,这个问题我刚好研究过!要检测PDF里的JavaScript或PostScript这类带活动性质的内容,其实核心就是解析PDF的内部结构,找出藏着这些代码的标记或对象。下面分享几个实用的Python方案,亲测靠谱:
方法一:用PyPDF2快速检测(入门友好)
PyPDF2是个上手简单的PDF处理库,能帮我们快速扫描PDF里的关键标记。
首先安装依赖:
pip install PyPDF2
然后用这段代码检测:
from PyPDF2 import PdfReader def detect_pdf_scripts(pdf_path): reader = PdfReader(pdf_path) has_javascript = False has_postscript = False # 检查文档打开时的自动执行动作 if "/OpenAction" in reader.metadata: open_action = reader.metadata["/OpenAction"] if isinstance(open_action, dict) and "/JS" in open_action: has_javascript = True # 遍历每个页面的附加触发动作(比如打开/关闭页面时执行的脚本) for page in reader.pages: if "/AA" in page: for _, action in page["/AA"].items(): if "/JS" in action: has_javascript = True break if has_javascript: break # 检查页面内容中是否有PostScript相关标记 page_content = page.extract_text() if page_content and ("PostScript" in page_content or "/ProcSet" in page_content): has_postscript = True # 扫描所有PDF对象,不放过任何藏着脚本的地方 for obj in reader.objects: if isinstance(obj, dict): if "/JS" in obj or "/JavaScript" in obj: has_javascript = True if "/PostScript" in obj: has_postscript = True return {"has_javascript": has_javascript, "has_postscript": has_postscript} # 调用示例 result = detect_pdf_scripts("your_file.pdf") print(f"是否存在JavaScript: {result['has_javascript']}") print(f"是否存在PostScript: {result['has_postscript']}")
这个脚本会检查三个关键位置:文档打开动作、页面附加动作,以及所有PDF对象里的脚本标记,基本能覆盖大多数常规情况。
方法二:用pdfminer.six深度解析(适合复杂PDF)
如果遇到结构复杂或者加密的PDF,pdfminer.six会更靠谱——它能深入解析PDF的底层对象,处理间接引用的内容。
先安装依赖:
pip install pdfminer.six
然后用这段代码检测:
from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument from pdfminer.pdftypes import resolve1 def detect_scripts_with_pdfminer(pdf_path): has_javascript = False has_postscript = False with open(pdf_path, 'rb') as f: parser = PDFParser(f) doc = PDFDocument(parser) # 检查文档级的打开动作 if "OpenAction" in doc.catalog: open_action = resolve1(doc.catalog["OpenAction"]) if isinstance(open_action, dict) and "JS" in open_action: has_javascript = True # 遍历所有PDF对象,解析间接引用的内容 for objid in doc.xref: obj = resolve1(doc.getobj(objid)) if isinstance(obj, dict): # 检查脚本相关的字典键 if "JS" in obj or "JavaScript" in obj: has_javascript = True if "PostScript" in obj or "ProcSet" in obj: has_postscript = True # 检查动作字典里的脚本 if "Action" in obj: action = resolve1(obj["Action"]) if isinstance(action, dict) and "JS" in action: has_javascript = True return {"has_javascript": has_javascript, "has_postscript": has_postscript} # 调用示例 result = detect_scripts_with_pdfminer("your_file.pdf") print(f"是否存在JavaScript: {result['has_javascript']}") print(f"是否存在PostScript: {result['has_postscript']}")
这里的resolve1函数是关键,它能把PDF里的间接引用对象转换成实际内容,避免漏掉藏在深层的脚本。
额外注意事项
- 如果PDF是加密的,记得先调用解密方法(比如PyPDF2里的
reader.decrypt("your_password")),否则无法解析内容。 - 有些恶意PDF会把JavaScript代码压缩或混淆在流里,这时候可以尝试提取流数据(比如用
obj.get_data()获取流内容),再进一步检查是否包含脚本特征。 - PostScript可能嵌入在资源字典或流中,上面的代码能检测常规标记,若要更深入,可以提取流内容后搜索PostScript关键字。
内容的提问来源于stack exchange,提问作者Martin Thoma
相关产品推荐
相关产品推荐

