寻找一些指导,指出我正确的方向。我们的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"中出售预期的#瓶啤酒。
基于三个数据集,在伦敦销售的预期啤酒瓶现在实际上是一个新的数据集,具体取决于上面的三个数据集。我们现在可以使用此数据集来计算新结果,例如"总预期酒精销售量"。
问题:
我们希望让用户能够编写自己的公式。我们的用户在基础编程技能很普遍的利基市场中工作。我们需要的是一个安全的沙箱环境,人们可以使用一种尚未确定的编程语言(或自定义语言?)编写程序代码,允许:
创建一个界面,用户可以选择数据集作为输入&键入他们的代码不是问题。我们正在寻找实际问题的一些指导:
任何有关使这项功能成为可能的最佳方法的想法都会受到高度赞赏,即使指向正确的方向也会有很大帮助!非常感谢提前!
答案 0 :(得分:2)
我认为有很多可能的解决方案可以解决您的问题并选择"正确的解决方案"在很大程度上取决于用户的需求和体验。
我最近有一个Java项目,用户可以编写评估对象列表状态的评分函数。经过一番搜索,我决定使用Java Nashorn Engine,因此使用Javascript作为编程语言。有一个名为V8js的PHP替代方案集成了V8 Javascript引擎。我从来没用过这个,但是 - 阅读文档 - 与Nashorn非常相似。
<强> 1。我们应该允许他们使用哪种编程语言
我认为没有客观的理由选择语言X而不是Y.然而,javascript对您的用户有一些优势。对我来说,Javascripts功能方面是决定性因素。
优点:
您可以将PHP变量传递给您的javascript,反之亦然。这甚至可以用于数组和对象。
Javascript是一种非常流行的编程语言,我们的用户可能已经知道。
您的用户可能会使用符合其需求的不同编程范例(程序,功能,面向对象)。
Javascript v8非常快,因为它可以及时编译本机机器代码。
缺点:
<强> 2。我们如何在现有的symfony / php网络环境中集成自定义代码,而不会产生巨大的安全风险?
您可以使用此插件限制最长执行时间和最大内存消耗。 javascript也在沙盒中运行。来自GitHub readme:
扩展程序允许您以安全的方式执行Javascript代码 来自PHP的沙箱。可以使用时间来限制执行的代码 限制和/或内存限制。这提供了执行的可能性 信任不受信任的代码。
第3。我们如何安全地处理语法错误,除以零等等
同样来自自述:
如果JavaScript代码抛出(没有捕获),则会导致错误或 没有编译,抛出V8JsScriptException异常,除非 构造V8Js对象时,report_uncaught_exceptions设置为FALSE。
我看不到功能白名单功能。但考虑到它在沙盒中运行,我认为没有必要吗?