使用 -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 不能包含访问磁盘的代码。
我正在尝试编写一些 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 不能包含访问磁盘的代码。