【问题标题】:GhostScript: Error: /invalidfileaccess in --file--GhostScript:错误:/invalidfileaccess in --file--
【发布时间】:2017-03-02 13:22:57
【问题描述】:

如果我尝试包含已知路径之外的文件,则会收到众所周知的错误:

Error: /invalidfileaccess in --file--

我知道我可以使用-DNOSAFER,但我想避免这种情况,因为这会允许执行恶意代码。

是否有选项告诉gs“您可以读取任何文件,但不得删除或删除任何文件”?

【问题讨论】:

    标签: ghostscript


    【解决方案1】:

    (从 gGt an output file with a count of PDF pages for each file with Ghostscript 复制答案;当我自己寻找解决方案时,这两个 SO 问题都出现了,没有骰子。:'-( )


    请注意,自 GhostScript 9.50 起,SAFER 模式已默认打开,导致类似 /invalidfileaccess 的错误,通过确保路径中的所有目录分隔符都是 / 正斜杠,这些错误不会消失,摆弄当前路径等

    今天这让我损失了不少头发和几个小时,但是到 2020 年,你需要做这样的事情:

    解决方案 1:使用 --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

    解决方案 2:使用 -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 的正确绝对路径

    注意事项

    适用于 PostScript 脚本,而不是 -f 命令行

    这个问题只发生在-c PostScript 命令中的文件加载,在使用-f <file> 直接在命令行上指定的 PDF/PS 源文件。

    如何检查这是否是您的实际问题

    测试 1:在没有额外的 -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的部分等。

    测试 2:当您使用-dNOSAFER 运行时,问题会消失吗?如果是,那么宾果游戏!

    当这个命令行:

    gs -q -dNOSAFER -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
    

    工作正常,那么这肯定表明您需要上述任一解决方案来消除/invalidfileaccess 错误。

    警告:您在网上找到的旧答案可能不再有效

    正如我在 SO 和其他地方看到的很多讨论,包括各种错误跟踪器,似乎没有人在任何地方提到这一点,因为所有这些页面/条目都来自 GhostScript 版本 9.50 和 2019AD 之前。

    引用from the 9.50 change notes:

    文件访问控制功能(通过-dSAFER 启用)已完全重写,并对设计进行了彻底的重新思考。有关详细信息,请参阅:更安全。

    请务必注意,-dSAFER 现在仅启用文件访问控制,并且不再对标准 Postscript 功能施加限制(特别是对setpagedevice 的限制)。如果您的应用程序依赖这些 Postscript 限制,请参阅 OLDSAFER,并请与我们联系,因为我们确实计划删除这些 Postscript 限制,除非我们有理由不这样做。

    重要提示:现在默认启用文件访问控制。要在没有这些控件的情况下运行 Ghostscript,请参阅 NOSAFER

    Windows 用户重要提示:见下文Incompatible Changes

    SAFER 更改是从 2019-09-30(版本 9.50)开始的

    【讨论】:

      【解决方案2】:

      没有。您要么使用 -dSAFER 来阻止文件访问,要么不使用(如果您的环境已经设置了 -dSAFER,则使用 -dNOSAFER)。

      不可能“有点安全”。

      【讨论】:

      • 安全对我来说不是黑白之间的灰度。它有几个方面。一方面是读取文件。另一方面是写文件。我想允许阅读,但不允许写作。非黑即白的思维让当前的局势变得不那么安全。只需在 StackO 或其他地方查看有关此问题的答案,就会知道 invalidfileaccess 错误。你读到的建议是:使用-DNOSAFER,根据我的观点,它允许很多。
      • 我们已经有人抱怨他们找到了一种枚举文件名的方法,即使设置了 -dSAFER (因为已修复),所以很明显他们不同意你的观点。您要么信任正在运行的 PostScript 程序的来源,要么不信任。如果您不信任它,那么您不能让它对您的文件系统做任意事情。答案还是一样的,不可能做你想做的。
      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2019-09-12
      • 2023-03-28
      • 2010-11-27
      • 2013-09-13
      相关资源
      最近更新 更多