更新2 :我得到了这个工作并且它正在运行:)
更新:请检查评论,@ urggami答案正常但有轻微问题。我可能会做一些非常简单的错误。
我最近决定必须非常好地学习Linux / Perl,然后我开始构建这个www.tryperl.com作为学习项目。这是一种 Cloud IDE 。
(自从我第一次接触perl,linux,bash,osx以来仅仅几个月,所以请放轻松我)
目前我使用Safe.pm评估代码,但我的游戏计划是:
一个单独的Amazon EC2 VM,它将评估不安全 perl代码并返回结果。 VM将被阻止从互联网和负载平衡。然后,我可以不时地从快照重置此计算机。
这主要是我将用于评估服务器上的perl代码的代码,我使用Time::Out进行超时管理:
my $code = ..
my $arg = ..
#create a file with random name
my $filename = rand().".pl";
open(FILE,">$filename")
print FILE $code;
close(FILE);
#use Time::Out to timeout after 10 secs
my $ret = timeout 10 => sub {
#run the file just created with $arg as an argument. << This is IMP
my $r = `perl $filename $arg`;
return $r;
};
if ($@){
return $@;
}
return $ret;
我的问题
我可以以某种方式避免物理文件创建并使用$ arg 管道$ code ?
像。
这已由@ikegami在评论中解决。open(FILE,"perl <some_magic> | ")
一样。可能听起来很愚蠢,但我不得不问:(
我似乎无法使用Capture::Tiny。我尝试在超时块中执行此操作:
my ($stdout, $stderr, $count) = capture { system('echo Hello') };
但我一直在变空! :(是不是因为它在超时内?(虽然我对此并不在意)
我还没有看到任何其他安全漏洞吗?我应该做分叉限制吗?我应该怎么做呢? (链接和一些指针会很好)
http://www.perltuts.com的作者在this article中说他使用qemu和debian图像来运行他的代码。除了限制叉,他的方法在语义上与我的相似吗?(再次请原谅我的无知,记住我几个月前才碰到一个linux盒子)
我的开发框是OSX 10.8,生产服务器是RHEL用于前端,Ubuntu用于Perl eval机器。我在EC2上运行。查看完整堆栈details here。
任何详细的答案都将得到赞赏并得到代表和独角兽的回报:)
答案 0 :(得分:5)
经过13天的努力,我终于做到了!!
我探讨了FreeBSD Jails,我的lack of networking经历以及我不得不多次重建操作系统驱使我离开的事实。 FreeBSD真的很酷!!我很快就会回来。
我谦虚地看着OpenVZ然后感谢@ewwhite我重温了Linux Containers并给了它一个合适的镜头。
文档不是很好,但this article对所有内容都有帮助。
一个限制:我对网络知之甚少,所以我通过在主机上禁用端口转发来阻止来自互联网的监狱。但是,jail仍然需要在网络上供主机与之通信,因此,您仍然可以在jail中执行 ping 来解析域名,但赢了不回应。因此任何内部Web请求都会失败。我还对Ping
进行字符串扫描并阻止它。
非常欢迎任何建议或改进!
我要感谢limits.conf @JakeFeasel @ikegami @ewwhite以及ubuntu.SE和unix.SE的帮助:
这就是它的样子: