如何运行一个只能向标准输出写入数据,并且只能从标准输入读取数据的脚本?

我希望我的用户可以在受控环境内编写代码并运行,例如Lua或Perl。 我的网站运行在Perl CGI上。 有没有一种方式可以运行孤立的perl / Lua / python等脚本,没有访问文件系统的访问权限,并通过stdout返回数据以保存在数据库中? 我需要一个安全的环境,如何应用限制?提前谢谢。 FYI:我想实现像ideone.com或codepad.org这样的东西

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

原文链接 https://stackoverflow.com/questions/9322042

点赞
stackoverflow用户224524
stackoverflow用户224524

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

2012-02-17 06:02:10
stackoverflow用户513763
stackoverflow用户513763

如果你打算用 Lua,请查看 Lua-users 维基上的这个页面:

Sandboxes

2012-02-17 08:45:09
stackoverflow用户1205792
stackoverflow用户1205792

如jpjacobs在Lua中所说,您可以通过创建沙盒来创建一个安全环境。在Lua中实现这一点的一种方法是覆盖标准不安全函数并调用自己的函数。

看下面这个例子:

function safeIORead()
    -- 进行处理
end

io.read = safeIORead

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

2012-02-17 11:40:06
stackoverflow用户1029453
stackoverflow用户1029453

对于 Perl,您可能想要使用 Safe 模块。正如 Joqus 提到的,您将提供自己的输入/输出函数,以便您进行控制。然而,这不适合胆小的人。如果您不确定自己在做什么,请不要将此类内容暴露在互联网上。

2012-02-17 14:36:29
stackoverflow用户1211342
stackoverflow用户1211342

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

io = nil
require = nil
dofile = nil
-- 等等...

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

2012-02-17 20:17:06