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

时间:2019-01-12 12:10:38

标签: ghostscript

我正在尝试编写许多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,请在答案中包括指向相关文档的链接。

1 个答案:

答案 0 :(得分:1)

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

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

但是,即使添加当前目录允许您读取文件,该文件也将很快停止与-dSAFER一起使用。正在设置-dSAFER时通过尤其是隐藏/删除任何非标准运算符来“强化”解释器的程序,如果有可能会滥用它们。

您的建议用法与-dSAFER不兼容。几乎可以肯定会禁止您使用的命令,因为它们本质上是不安全的。本质上,通过弄乱内部PDF文件,您的 PostScript 程序是不安全的。

当然,知道您的PostScript程序是安全的,并且由于您没有执行PDF的任何部分,因此PDF也很安全。仅当您尝试实际执行内容(程序不会这样做)时,PDF才是不安全的。只需打开文件,然后读取Pages树,然后告诉您与Count键关联的值即可。

因此,在此特定示例中,您始终不需要设置-dSAFER。但是,任何执行PDF内容的程序(例如,通过呈现其中的任何部分,或将其发送到pdfwrite设备)都不安全。

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