适合在沙箱中运行客户端代码的语言

Ant*_*tiz 12 javascript c# java security sandbox

我想在我的服务器上模拟(不安全)客户端代码,我正在寻找一种合适的语言来实现.我希望客户端使用与我用来模拟的语言相同的语言.

  • 安全是首要关注的问题
  • 最好是一种众所周知的语言(方便客户学习语法)
  • 应该很容易禁用/启用沙箱中可用的语言功能
  • 如果我能够逐步模拟代码,那将是一个加分

理想情况下,我只需构建一些接口(并发布这些接口),加载客户端代码,并通过允许它仅使用我的接口+我仔细选择的标准API的子集来模拟该代码.

在此模拟期间,我应该能够限制客户端代码使用的资源(时间和内存).如果我可以逐步模拟代码,那么我将总是可以返回确定性解决方案.

性能不是真正的问题.这个想法是允许客户为小型游戏/拼图编写自定义AI.游戏将被模拟(在服务器上!)并且结果返回给用户.

最初我在考虑自己构建一个外部DSL,包括解析器和评估器,但也许有一个现成的解决方案?

Ale*_*kov 5

我的选择是使用某种脚本语言,无需自动提供对某些扩展框架(如 .Net 或 Java)的访问即可使用 - 添加功能比限制功能更容易。像LUA这样的游戏引擎脚本语言可能是一种选择,并且通常带有多个平台的实现来使用它们。

一般注意事项:

无论您选择哪种语言/框架,请确保您可以从以下风险中恢复/接受以下风险:

  • 致命异常(例如由于递归函数导致的堆栈溢出)
  • 无限制内存分配/内存不足异常
  • 长时间运行的任务

请谨防暴露允许用户在您的控制之外创建新线程/任务/同步对象(锁/信号量)的 API,或在提供此类 API 的平台上进行构建。允许此类方法可能会导致服务器资源无限消耗或出现 DOS/死锁...

请注意,长时间运行的任务对于任何合理的语言来说都是一个问题,因为您无法通过查看程序来确定它是否结束 -停止问题。无论您选择什么平台,您都必须找出解决方案。

.Net/C#:

您可以查看Terrarium,它在 .Net 中正是执行此操作 - 在沙盒环境中的用户计算机上运行不受信任的代码。

.Net 提供了一种限制多个 API 的使用的方法 -如何:在沙箱中运行部分受信任的代码是一个很好的起点。请注意,正如 @Andrew 指出的那样,最好验证用户提供的程序集(直接或从用户的源代码编译)是否不使用您不喜欢的 API(或者甚至相反 - 仅使用 API)除了基本的沙箱之外,您确实允许)。在单独的 AppDomain 中运行的部分受信任的代码可以为您提供良好的保护,免受不太敌对的代码的侵害。

一般来说,堆栈溢出很难预防,并且需要在 .Net 中使用自定义主机来处理。长时间运行的任务可以通过 Thread.Abort 终止,或者使用用户代码关闭 AppDomain。


poy*_*poy 0

我推荐 .NET(C#、VB 和 F#)。您可以利用 JIT 让服务器以编程方式编译代码,使用反射来分析代码,并使每个客户端在单独的 AppDomain 中运行以实现安全性和代码隔离。