沙盒,用户可以在Web应用程序中创建自己的代码/公式

时间:2017-07-12 01:23:25

标签: php symfony security

寻找一些指导,指出我正确的方向。我们的Web服务是用Symfony / PHP构建的(但问题可能与平台无关)。

首先让我解释一下我们当前的设置:

数据库包含数千个数据集。每个数据集仅包含日期/值对,其中值始终为浮点数或整数。示例(虚拟数据):

Date       | Temperature in London
----------------------------------
10-07-2017 | 28
11-07-2017 | 26


Date       | Is Bank Holiday
----------------------------
10-07-2017 | 1
11-07-2017 | 0


Date       | Population in London
---------------------------------
10-07-2017 | 8788235
11-07-2017 | 8789804

我们的服务结合了这些数据集并应用(有时是复杂的)公式来计算结果'基于数据。基本上是一个函数,它接收所需的日期和需要组合的数据源,然后进行一些计算并返回结果'那天。例如,根据上面显示的数据集,可以在Londen"中出售预期的#瓶啤酒。

基于三个数据集,在伦敦销售的预期啤酒瓶现在实际上是一个新的数据集,具体取决于上面的三个数据集。我们现在可以使用此数据集来计算新结果,例如"总预期酒精销售量"。

问题:

我们希望让用户能够编写自己的公式。我们的用户在基础编程技能很普遍的利基市场中工作。我们需要的是一个安全的沙箱环境,人们可以使用一种尚未确定的编程语言(或自定义语言?)编写程序代码,允许:

  • 使用变量
  • 应用一些基本的数学基础:添加,分散注意力,倍增,分割。
  • if / else blocks
  • 理想情况下能够创建和操作数组
  • 理想情况下可以使用循环

创建一个界面,用户可以选择数据集作为输入&键入他们的代码不是问题。我们正在寻找实际问题的一些指导:

  1. 我们应该允许它们使用哪种编程语言(最好是一种具有快速性能而不是上面列出的功能的功能),还是应该创建自己的语法?
  2. 我们如何在现有的symfony / php网络环境中集成自定义代码,而不会产生巨大的安全风险?在前端完全执行计算不是一种选择 - 我们需要以某种方式在服务器上存储公式的结果。
  3. 我们如何安全地处理语法错误,零除等等,并确保用户无法访问除所选语言的白名单之外的任何其他功能?
  4. 任何有关使这项功能成为可能的最佳方法的想法都会受到高度赞赏,即使指向正确的方向也会有很大帮助!非常感谢提前!

1 个答案:

答案 0 :(得分:2)

我认为有很多可能的解决方案可以解决您的问题并选择"正确的解决方案"在很大程度上取决于用户的需求和体验。

我最近有一个Java项目,用户可以编写评估对象列表状态的评分函数。经过一番搜索,我决定使用Java Nashorn Engine,因此使用Javascript作为编程语言。有一个名为V8js的PHP替代方案集成了V8 Javascript引擎。我从来没用过这个,但是 -  阅读文档 - 与Nashorn非常相似。

<强> 1。我们应该允许他们使用哪种编程语言

我认为没有客观的理由选择语言X而不是Y.然而,javascript对您的用户有一些优势。对我来说,Javascripts功能方面是决定性因素。

优点

  • 您可以将PHP变量传递给您的javascript,反之亦然。这甚至可以用于数组和对象。

  • Javascript是一种非常流行的编程语言,我们的用户可能已经知道。

  • 您的用户可能会使用符合其需求的不同编程范例(程序,功能,面向对象)。

  • Javascript v8非常快,因为它可以及时编译本机机器代码。

缺点

  • 您需要安装PHP扩展v8js和V8 Javascript引擎库(libv8)。

<强> 2。我们如何在现有的symfony / php网络环境中集成自定义代码,而不会产生巨大的安全风险?

您可以使用此插件限制最长执行时间和最大内存消耗。 javascript也在沙盒中运行。来自GitHub readme

  

扩展程序允许您以安全的方式执行Javascript代码   来自PHP的沙箱。可以使用时间来限制执行的代码   限制和/或内存限制。这提供了执行的可能性   信任不受信任的代码。

第3。我们如何安全地处理语法错误,除以零等等

同样来自自述:

  

如果JavaScript代码抛出(没有捕获),则会导致错误或   没有编译,抛出V8JsScriptException异常,除非   构造V8Js对象时,report_uncaught_exceptions设置为FALSE。

我看不到功能白名单功能。但考虑到它在沙盒中运行,我认为没有必要吗?

相关问题