我正在尝试编写许多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
,请在答案中包括指向相关文档的链接。
答案 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不能包含访问磁盘的代码。