如何运行只能写入STDOUT并从STDIN读取的脚本?

时间:2012-02-17 02:19:36

标签: python perl scripting lua cgi

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

这样的东西

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

5 个答案:

答案 0 :(得分:3)

我想到的一个想法是为每个用户创建一个chroot'ed env并在chroot'ed env中运行用户的脚本。

答案 1 :(得分:1)

如果您打算使用Lua,请在Lua-users wiki上查看此页面:

Sandboxes

答案 2 :(得分:0)

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

检查此示例:

function safeIORead()
    --do the processing
end

io.read = safeIORead

这种方式每次调用函数io.read时都会指向你的函数而不是标准的Lua函数。 这只是如何在Lua中使用沙箱的一个例子。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

对于Lua模块,只需将关键模块放到nil:

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

通过这种方式,您可以毫无问题地运行Lua脚本,我认为您可以使用装载字符串功能和 setfenv ,以便为用户定义自己的环境&#39 ; s代码。