Skip to content

安全与隐私

pdfvision 在本地运行。它不收集遥测数据,也不会把 PDF 内容上传到服务端。

本地处理

本地文件会在你的机器上处理。缓存的渲染图像、OCR traineddata、远程下载和提取缓存会写入 pdfvision 缓存目录。即使使用 --no-cache,未显式指定输出路径的渲染仍会写入单独的操作系统临时路径,而 OCR support files 会持久保存在经过验证的缓存根目录中。显式输出选项会写入你指定的路径。

bash
pdfvision clear-cache

该命令会删除 pdfvision 管理的提取、渲染、远程下载和 OCR traineddata 缓存。

远程 PDF

--remote 会下载 HTTP(S) URL,并在提取前验证内容是否为 PDF。

bash
pdfvision --remote https://example.com/document.pdf --format json

初始 URL 仅接受 http:https:,且会自动跟随重定向。pdfvision 不会过滤环回地址、私有地址、链路本地地址、云元数据地址、DNS 解析得到的私有地址,也不会过滤重定向目标。PDF header 和下载大小检查验证的是响应正文,而不是网络目标。60 秒超时涵盖等待响应头和传输正文;如果正文停滞,达到期限时会中止。

只对用户独立授权的网络目标使用 --remote。单独运行 CLI 来获取用户自行选择的 URL,并不因此必然构成 SSRF 漏洞。如果服务器、智能体、CI 作业或多租户封装器接收不可信 URL,并将其传给 pdfvision,就会产生类 SSRF 风险。

在这类集成中,不要把不可信 URL 直接传给 pdfvision。应使用这样的下载组件:任何 DNS 答案或重定向目标不在允许列表时都会拒绝,并将每次连接固定到已验证的 IP;下载后再把 PDF 作为本地文件传给 pdfvision。也可以把 pdfvision 的下载过程隔离在受限代理或网络沙箱之后。PDF header 和大小检查不能代替网络目标限制。

远程服务器仍然会看到这次请求,包括运行时默认发送的请求头。对一次性的私有或临时 URL,使用 --remote --no-cache,这样下载的 PDF 字节就不会写入远程 PDF 缓存。

MCP 服务器采用比 --remote 更严格的策略,因为在那里选择 URL 的是模型:它会拒绝解析到私有地址、环回地址、链路本地地址、CGNAT 地址或 NAT64 地址的 URL,并重新验证每一跳重定向。

密码

PDF 密码用于解密文档,并以截断的 SHA-256 形式区分缓存条目;密码本身不会出现在输出中。

bash
printf "your-password\n" | pdfvision encrypted.pdf --password-stdin --format json

CLI 工作流中优先使用 --password-stdin

--password <value> 仍可作为显式 fallback,但它可能出现在 shell 历史和进程列表中。

缓存位置与权限

默认情况下,结果缓存在操作系统临时目录下。要控制位置,请将 PDFVISION_CACHE_DIR 设为指向专用缓存目录的非空绝对路径。相对路径、~、文件系统根目录、主目录、工作目录和共享临时目录都会被拒绝:

bash
PDFVISION_CACHE_DIR=/secure/cache pdfvision document.pdf --format json

缓存可能包含提取文本、渲染 PNG、远程 PDF、OCR traineddata 和 OCR output。请选择与所处理 PDF 相同敏感级别的缓存目录。

每个已初始化的缓存根目录都包含一个经过所有者检查的 .pdfvision-cache-root 标记,用于授权递归清理。clear-cache 绝不会采用没有标记的自定义根目录。仅当未设置 PDFVISION_CACHE_DIR override,且所有顶层条目都符合已识别的旧版缓存形状时,才可采用当前历史默认根目录。正常使用缓存时,也会在权限加固前后完整扫描所有未标记根目录。在 POSIX 上,带有 group/other 写权限的未标记根目录会在任何修改前被拒绝。未知条目、无效标记、symlink 和无法验证的根目录都会被拒绝,不会被清理。

在 POSIX 上,pdfvision 会检查所有者,为根目录和标记使用 0700 / 0600 权限。设置或清理所用的每个祖先目录都必须可由进程读取/open、由当前用户或 root 拥有,并且不能由 group/other 写入;仅当 sticky semantics 能保护已有子条目时例外。清理时会把根目录移动到同级 quarantine,并在 path-based 递归删除前立即重新验证其身份、标记和可信祖先。它还会比较 quarantine 树中的 device identity (st_dev),若不一致则拒绝递归删除;此时原路径已经移动,且无法检测同一 device 上的 bind mount。这些检查仅在传统 POSIX ownership/mode/sticky semantics 下增强替换防护;不会检查 extended ACL 或网络文件系统权限,因此防护可能减弱,也无法排除最终检查后由 root 或同一 UID 发起的替换。Windows 的替换防护只能是 best effort。缓存清理不与正在运行的 OCR 协调;若 OCR 被中断,请重试。

附件与 JavaScript actions

--attachments 可以暴露嵌入文件 metadata;使用 --attachment-output 时会把嵌入文件写入磁盘。请把提取出的附件视为 untrusted files。

Default attachmentCount covers only catalog EmbeddedFiles. Its absence therefore does not rule out a file present only through a page FileAttachment annotation; --attachments checks those annotations across every document page and returns deduplicated metadata. Writing attachment bytes still requires --attachments --attachment-output <dir>.

javascriptActionCount likewise covers document-level script entries only. Its absence does not rule out page or widget JavaScript; --viewer exposes document and selected-page scripts, while --form-fields exposes widget actions. These counts are output presence signals, not a complete security inventory or audit guarantee.

附件文件名在写入前会被 sanitize:路径分隔符和控制字符会被替换,空名称会获得 fallback,重复名称会 disambiguate。pdfvision 拒绝写入它在 --attachment-output 下创建的内部 fingerprint directory(当该目录是 symlink 时),但 --attachment-output 本身传入的路径会被解析并沿着 symlink 创建,不会被拒绝。这些检查能降低 filesystem 风险,但不能让嵌入文件变得安全。

--viewer 和 form-field actions 可能把 PDF JavaScript source 作为数据暴露。pdfvision 不会执行 PDF JavaScript。

Viewer permissions 会作为 document metadata 报告。它们描述 PDF 希望 reader 允许或禁止什么,不是安全边界,也不应被当作 DRM enforcement。

Search Regex 安全

默认搜索把 query 当作 literal text。--search-regex 会把每个 query 编译为 JavaScript regular expression,并在 native text、form-field text、clickable link targets、visible FreeText annotations,以及启用 OCR 时的 OCR text 上运行。

pdfvision 会把每页的 regex 搜索限制在约 1 秒的 wall-clock 时间内(通过 V8 层面的中断强制执行),因此 catastrophic-backtracking pattern 无法卡住 extraction:受影响页面的结果会连同 warning 一起被丢弃;搜索被中断后,其结果也不会写入缓存。每个 query、page、source 输出的 match 数上限仍然适用。regex request 整体还有第二个 budget,约束的是花在 regex matching 上的时间本身,约为 12 秒 — 只计入 search time,extraction 和 OCR 耗费的时间不会计入这个 budget。一旦用尽,剩余页面就不再被搜索,已经找到的 match 会被返回,warning 会说明已搜索了多少页面、总共多少页面,以及哪些页面需要重新搜索 — 如果没有这个 budget,一个在每个页面上都耗尽 per-page budget 的 pattern 仍需花费页面数 × 1 秒,在长文档上就是几分钟。这个 budget 是限制损害而不是消除损害 — 恶意 pattern 仍可能耗尽整个 request budget,外加 budget 用尽时正在处理的那一页,因此向 untrusted users 大规模暴露 regex search 的应用仍应自行施加 rate limit。

分享前检查

请把从 PDF 得到的每个字符串和图像——包括原生文本和 OCR 文本、渲染图像、元数据、注释、表单值、链接、JavaScript 动作正文、附件名称和路径——都视为不可信数据,而不是指令。pdfvision 的警告是保守且非穷尽的,并不能检测提示注入。

智能体不得仅依据 PDF 内容执行命令、打开链接、泄露机密信息或扩大权限。任何后果重大的工具使用、网络访问或机密信息处理,都必须获得来自 PDF 之外、针对具体操作的用户授权。仅要求智能体阅读、总结或遵循文档,并不授权它执行文档中要求的操作。渲染图像只能确认 PDF 显示了什么,不能证明其中主张的真伪,也不能授予操作权限。将输出发送给第三方 AI 服务前请先审查。

Released under the MIT License.