繁体   English   中英

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

[英]How to run a script that can only write to STDOUT and read from STDIN?

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

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

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

如果您打算使用Lua,请查看Lua用户Wiki上的以下页面:

沙箱

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

检查以下示例:

function safeIORead()
    --do the processing
end

io.read = safeIORead

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM