【问题标题】:How to run a script that can only write to STDOUT and read from STDIN?如何运行只能写入 STDOUT 并从 STDIN 读取的脚本?
【发布时间】:2012-03-08 11:40:22
【问题描述】:

我希望我的用户编写代码并在受控环境中运行,例如 Lua 或 Perl。我的网站在 Perl CGI 上运行。 有没有办法在不访问文件系统的情况下运行隔离的 perl/Lua/python/etc 脚本并通过标准输出返回数据以保存在数据库中? 我需要的是一个安全的环境,我该如何应用这些限制?提前致谢。 仅供参考:我想实现类似 ideone.com 或 codepad.org 的目标

我一直在阅读有关 Lua 或内联代码中的沙盒的信息,但它们不允许我限制资源和时间,而只是限制操作。我想我会有一个虚拟机并在其中运行代码,有什么提示吗?

【问题讨论】:

  • 这是可能的(请参阅 google appengine 以获取执行此操作的功能系统的示例),但老实说,您如何完成它有点超出我的想象。

标签: python perl scripting lua cgi


【解决方案1】:

我想到的一个想法是为您的每个用户创建一个 chroot 环境并在该 chroot 环境中运行用户的脚本。

【讨论】:

  • 但是如果我 chroot 一个像 perl 这样的脚本,它就不能访问编译器/解释器的内容吗?
  • 如果您 chroot 到一个目录并在该 chroot 中执行 perl 脚本,该脚本将无法访问整个文件系统。它只能访问该 chroot 中的文件系统。如果您想允许访问 chroot 之外的某些文件,您可以将这些目录挂载到 chroot 中。在 [link]{en.wikipedia.org/wiki/Chroot} 阅读有关 chroot 的更多信息。
【解决方案2】:

如果您打算使用 Lua,请查看 Lua 用户 wiki 上的此页面:

Sandboxes

【讨论】:

    【解决方案3】:

    正如 jpjacobs 在 Lua 中所说,您可以通过创建沙箱来创建保存环境。在 Lua 中执行此操作的一种方法是覆盖标准的不安全函数并调用您自己的函数。

    检查这个例子:

    function safeIORead()
        --do the processing
    end
    
    io.read = safeIORead
    

    这样每次调用函数 io.read 时,它都会指向你的函数,而不是标准的 Lua 函数。 这只是一个如何在 Lua 中使用沙盒的示例。

    【讨论】:

      【解决方案4】:

      对于 Perl,您可能希望使用 Safe 模块。正如 Joqus 所提到的,您将提供您自己控制的输入/输出功能。但它不适合胆小的人。如果您不确定自己在做什么,请不要将此类内容暴露在互联网上。

      【讨论】:

        【解决方案5】:

        对于 Lua 模块,只需将关键模块设置为 nil 即可:

        io = nil
        require = nil
        dofile = nil 
        -- etc ...
        

        这样你就可以毫无问题地运行 Lua 脚本,而且我认为你可以使用 loadstring 函数和 setfenv 来为用户代码定义自己的环境。

        【讨论】:

        • 通过这样做,您将函数或表置于 nil 然后用户不能调用它/使用它,如果他这样做,它会引发一个错误,你可以用 pcall() 函数处理。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2011-05-05
        • 2017-08-16
        • 2012-11-16
        相关资源
        最近更新 更多