【发布时间】:2017-03-02 13:22:57
【问题描述】:
如果我尝试包含已知路径之外的文件,则会收到众所周知的错误:
Error: /invalidfileaccess in --file--
我知道我可以使用-DNOSAFER,但我想避免这种情况,因为这会允许执行恶意代码。
是否有选项告诉gs“您可以读取任何文件,但不得删除或删除任何文件”?
【问题讨论】:
标签: ghostscript
如果我尝试包含已知路径之外的文件,则会收到众所周知的错误:
Error: /invalidfileaccess in --file--
我知道我可以使用-DNOSAFER,但我想避免这种情况,因为这会允许执行恶意代码。
是否有选项告诉gs“您可以读取任何文件,但不得删除或删除任何文件”?
【问题讨论】:
标签: ghostscript
(从 gGt an output file with a count of PDF pages for each file with Ghostscript 复制答案;当我自己寻找解决方案时,这两个 SO 问题都出现了,没有骰子。:'-( )
请注意,自 GhostScript 9.50 起,SAFER 模式已默认打开,导致类似 /invalidfileaccess 的错误,通过确保路径中的所有目录分隔符都是 / 正斜杠,这些错误不会消失,摆弄当前路径等
今天这让我损失了不少头发和几个小时,但是到 2020 年,你需要做这样的事情:
--permit-file-read=<path> 将源路径添加到接受列表中,以使 /invalidfileaccess 消失gs -q --permit-file-read=d:/ -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
即确保您在 PostScript 命令/脚本中加载的 PDF 的路径在批准列表(也称为权限列表)中,using one of the --permit-file-xyz commandline arguments。
-I<path> 快速破解以使 /invalidfileaccess 消失gs -q -Id:/ -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
即确保您在 PostScript 命令/脚本中加载的 PDF 的路径在批准列表中,也就是权限列表。
上面示例中的-Id:/ 只是一个快速的技巧,以确保您的路径的源路径在该列表中,鉴于此位from the official documentation:
最后,命令行提供的路径(如-I、-sFONTPATH 参数中的路径)被添加到允许阅读列表中。同样,在初始化期间从 Fontmap、cidfmap 和平台特定的字体文件枚举(例如 Unix 系统上的 fontconfig)读取的路径会自动添加到允许读取列表中。
-I 时的期望:对我来说另一个惊喜是
gs -q -I d:/ -dNODISPLAY -c "(test.pdf) (r) file runpdfbegin pdfpagecount = quit"
即在 -I 包含集中指定 PDF 的源路径,然后在 PostScript 命令中省略它,仍然给了我一个 /invalidfileaccess,所以请确保指定一个您正在加载的 PDF 的正确绝对路径。
-f 命令行这个问题只发生在-c PostScript 命令中的文件加载,不在使用-f <file> 直接在命令行上指定的 PDF/PS 源文件。
-I<path> 或 --permit-file-read=<path> 的情况下尝试相同的方法:错误是否返回?如果是,那么宾果游戏!当这个命令行(注意缺少的-Id:/ 或--permit-file-read=d:/ 是唯一的变化):
gs -q -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
给你“无效的文件访问”错误,如下所示:
Error: /invalidfileaccess in --file--
Operand stack:
(d:/test.pdf) (r)
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval--
Dictionary stack:
--dict:737/1123(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)--
Current allocation mode is local
Last OS error: Permission denied
GPL Ghostscript 9.52: Unrecoverable error, exit code 1
你很可能有a -dSAFER problem,这是通过上面将PDF源目录添加到接受的路径列表来修复的(另请参阅the GhostScript documentation at 'NOSAFER'及以后的内容,包括关于--permit-file-read=pathlist的部分等。
-dNOSAFER 运行时,问题会消失吗?如果是,那么宾果游戏!当这个命令行:
gs -q -dNOSAFER -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
工作正常,那么这肯定表明您需要上述任一解决方案来消除/invalidfileaccess 错误。
正如我在 SO 和其他地方看到的很多讨论,包括各种错误跟踪器,似乎没有人在任何地方提到这一点,因为所有这些页面/条目都来自 GhostScript 版本 9.50 和 2019AD 之前。
文件访问控制功能(通过
-dSAFER启用)已完全重写,并对设计进行了彻底的重新思考。有关详细信息,请参阅:更安全。请务必注意,
-dSAFER现在仅启用文件访问控制,并且不再对标准 Postscript 功能施加限制(特别是对setpagedevice的限制)。如果您的应用程序依赖这些 Postscript 限制,请参阅OLDSAFER,并请与我们联系,因为我们确实计划删除这些 Postscript 限制,除非我们有理由不这样做。重要提示:现在默认启用文件访问控制。要在没有这些控件的情况下运行 Ghostscript,请参阅
NOSAFERWindows 用户重要提示:见下文Incompatible Changes
SAFER 更改是从 2019-09-30(版本 9.50)开始的
【讨论】:
没有。您要么使用 -dSAFER 来阻止文件访问,要么不使用(如果您的环境已经设置了 -dSAFER,则使用 -dNOSAFER)。
不可能“有点安全”。
【讨论】:
-DNOSAFER,根据我的观点,它允许很多。