使用 -dSAFER 从 Ghostscript 命令访问文件

Accessing files from Ghostscript commands with -dSAFER

我正在尝试编写一些 gs 命令供服务器端使用。我必须使用的用户提供的 PDF/JPEG 文件不能被认为是安全的(可能会提供损坏的甚至恶意文件)。因此,我试图用 -dSAFER 编写我所有的 Ghostscript 命令,以至少保证基本的安全级别。

不幸的是,-dSAFER 似乎与某些 gs 命令不兼容。以下面的命令为例:

# count number of pages in PDF
gs -dQUIET -dBATCH -dNOPAUSE -dNOSAFER -dNODISPLAY \
   -c "(input.pdf) (r) file runpdfbegin pdfpagecount = quit"

你会如何用 -dSAFER 重写这个命令?如果我只添加 -dSAFER,命令将失败,因为 gs 无法读取文件 input.pdf(这是我所期望的)。我如何告诉 gs 允许读取 input.pdf,但不能读取其他内容?也许有一种方法可以只允许从特定目录读取文件?


这是第二个示例命令:

# convert JPEG to single-page PDF
gs -dQUIET -dBATCH -dNOPAUSE -dNOSAFER \
   -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSettings=/printer \
   -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray \
   -sOutputFile=output.pdf \
   viewjpeg.ps \
   -c "(input.jpg) << /PageSize 2 index viewJPEGgetsize 2 array astore >> setpagedevice viewJPEG"

这个命令和第一个命令有完全一样的问题。我如何用 -dSAFER 重写这个?


如果您认为我的命令确实不需要 -dSAFER,请在您的回答中为相关文档添加 link。

您可以使用 -I 将目录添加到搜索列表,IIRC 允许读取任何此类目录。对于当前目录,您还可以使用 -P--P.

请参阅 ghostpdl/doc 目录中的 Use.htm。

然而,即使添加当前目录允许您读取文件,这将很快停止使用 -dSAFER。当 -dSAFER 由 hiding/remobing 任何非标准运算符 尤其是 设置时,有一个正在进行的程序 'harden' 解释器,如果它们有可能被滥用的话.

您提议的用法与 -dSAFER 不兼容。您正在使用的命令几乎肯定会被特别禁止,因为它们本质上是不安全的。本质上,像那样乱搞内部 PDF 文件,您的 PostScript 程序是不安全的。

当然,知道您的 PostScript 程序是安全的,并且由于您没有执行 PDF 的任何部分,因此 PDF 也是安全的。只有当您尝试实际执行您的程序不会执行的内容时,PDF 才会不安全。它只是打开文件读取页面树,并告诉您与 Count 键关联的值。

所以您无论如何都不需要在此特定示例中设置 -dSAFER。然而,任何执行 PDF 内容的此类程序(例如,通过渲染它的任何部分,或将其发送到 pdfwrite 设备)都是不安全的。

您的第二个示例也不需要 SAFER,因为 JPEG 不能包含访问磁盘的代码。