我目前正在开发一个编程竞赛网站,并希望实现对提交代码和在网站上运行它的支持。经过相当多的谷歌搜索,我仍然没有找到任何“指南”。
有谁知道包含一些基本准则或基本规则的网站(或其他来源)?
感谢所有回复。
PS:如果有人想知道所有的编程语言标签,我打算至少支持这些语言。
我目前正在开发一个编程竞赛网站,并希望实现对提交代码和在网站上运行它的支持。经过相当多的谷歌搜索,我仍然没有找到任何“指南”。
有谁知道包含一些基本准则或基本规则的网站(或其他来源)?
感谢所有回复。
PS:如果有人想知道所有的编程语言标签,我打算至少支持这些语言。
有一个网站已经这样做了,尽管是为了特定目的:抓取数据。
https://scraperwiki.com/ - 与 jsfiddle 不同,scraperwiki执行服务器端代码。据我所知,他们可能会通过亚马逊实例将环境沙箱化。鉴于他们支持的语言和抓取库的多样性,不确定他们的代码是否可以被完全审计和清理。
我认为大多数人对 scraperwiki 如何阻止黑客和垃圾邮件发送者滥用他们的资源感到困惑。他们对此一直保持沉默。要么他们已经手动审核了每一个执行的代码,要么黑客/垃圾邮件发送者还没有发现它们。由于该站点具有特定功能,因此他们可能会检查数据利用率以确定可疑活动。...但是,一个人的网站抓取是另一个人通过获取/发布的骚扰和注入。
我的预感是他们永远不会公开说明他们的安全审计过程是什么样的。
如果您真的必须这样做,那么在没有虚拟化的情况下执行此操作的最简单机械方法是使用eval()的变体。但是,并非所有语言都有。这将您带到选项 B,即虚拟化。比我更好的人可以解释如何将虚拟机编组到这种效果,并且会适当地警告你不要让陌生人滥用你的资源。相反,我将分享我的 PHP 经验。
几年前,我做了一个项目,可以即时执行代码(在本地机器上)。当您键入时,它会通过 ajax 获取代码并在每次击键后执行。这是其行为的视频:http ://www.youtube.com/watch?v=Yfxrt2pc3pg 。
五年和 3 个改进原型之后,我仍然不确定我将如何负责任地将其锁定为公共资源。
小心——如果你发现很难将这个项目分解成一些更小、更具战术性的问题,我强烈建议你不要尝试在你的网站上实际运行任何其他人的代码。在创建网站本身方面,我建议尽可能利用预构建的组件或服务——Wordpress、GitHub 等。
收到提交后,您将希望有一种方法可以安全地运行它们。出于所有实际目的,这意味着您应该假设运行其他人代码的任何机器都可能自发地起火。虽然其中一些语言确实具有您应该能够用于在“沙箱”中运行代码的功能,但您可能不会在所有这些语言方面都足够熟练,无法正确保护所有这些语言。
似乎亚马逊的 EC2 之类的东西可能会有所帮助——当您需要运行提交时启动 VM,并在完成后将其丢弃。他们有一些预配置的图像,可能非常适合运行此代码,如果由于错误或恶意代码而出现问题,您不必太介意,因为您只是将其扔掉完成后离开。
对于 Java,这很简单:
您必须创建Servlet,用于将源代码上传到服务器(例如,通过 POST 请求)
使用 Java Compiler API 将源代码编译为字节码(教程)
您可以通过ClassLoader动态加载并启动它的编译字节码(您也可以配置SecurityManager)
并且不要忘记 MVC 架构 :)