3

这是我的情况。我正在构建一个应用程序,其中包含一些繁重的数学计算,其中公式需要由具有足够特权但不受信任的用户编辑。

我需要一种安全的服务器端脚本语言。我需要能够访问 4 个以上数据库表中的常量和值、先前计算的结果、定义用户变量和函数、使用 if/then/else 语句,而且我确信还有更多我想不到的东西现在。

我考虑过的一些选项:

  1. 我考虑过使用类似这个 matheval 库的东西,但我最终需要为我的用例大幅扩展它。我基本上是在创建自己的自定义语言。

  2. PHP runkit 沙箱。我以前从未使用过它,但我非常担心所涉及的安全问题。考虑到可能的安全问题,我认为这不是一个可行的选择。

  3. 我不知道是否有可能的另一个想法是在服务器端使用类似 javascript 的东西。我已经看到 js 在桌面应用程序中用作脚本平台来扩展功能,并且似乎类似的方法可能是可行的。我可以理想地定义运行它的环境,例如禁用文件系统访问等。同样,安全性似乎是一个问题。

从我所做的研究来看,#1 似乎是我唯一的选择,但我想我会检查一个更大的人才库。:-)

如果#3 是可能的,这似乎是要走的路,但我似乎无法找到任何有用的东西。另一方面,#2 和#3 之间可能没有太大区别。

性能是另一个考虑因素。大约有 65 个奇怪的公式,每个公式执行大约 450 次。每个公式都可以访问大约 15 个唯一变量、一百个左右的常数,以及之前公式的结果。(是的,有一个特定的执行顺序。)

我可以使用异步方法进行计算,其中计算将由用户事件启动并存储在数据库中,但宁愿不必这样做。

处理这种情况的最佳方法是什么?我的研究中是否还有其他第三方库没有出现?除了我的 3 之外,我还应该考虑其他选择吗?

4

2 回答 2

1

今天几乎没有理由创建自定义语言。有这么多可用和可破解的,编写自己的真的是浪费时间。

如果您不为无数用户提供服务(对于无数的各种值),那么大多数现代脚本语言都是安全的,特别是如果您愿意采取严厉措施来做到这一点(例如完全消除 I/O 和系统接口) )。

JavaScript 是一个有效的选项。在 JS 本身中创建迷你沙箱来运行外部代码很简单。如果您希望人们能够跨运行保持状态,只需要求他们将其存储在“类似 JSON”的 JS 结构中,这些结构可以在退出时从系统中轻松序列化,并且可以轻松重新加载。这些甚至可以是函数的结果。

如果您不想让他们使用某个函数或例程,您可以在触发外部代码之前取消定义它。不希望他们使用“读取”来读取文件?read = func(s) { }

显然,您应该与想要使用的 JS 实现的邮件列表交谈,以获得一些更好地保护它的提示。

但是 JS 有很好的支持,有据可查,而且解释器真的很容易使用。

于 2012-05-29T01:40:02.763 回答
0

您有两个基本选择:

a)提供您自己的语言,您可以完全控制所做的事情,因此不会发生任何不好的事情,

b) 使用其他一些执行引擎,并检查它所做的一切以验证没有发生任何不良情况。

我对 b) 的问题是很难弄清楚某人可能以晦涩的方式做的所有坏事。

我更喜欢 a),因为你只需要让他们有能力做你允许的事情。

如果您想要处理一组相当简单的公式,那么编写解析器/评估器实际上非常容易。请参阅是否有可用于 8 位嵌入式系统的 flex/bison 替代方案?

我不清楚你有性能问题。是的,你想执行 450 次;但它包括数据库访问,其成本将支配任何涉及 1000 个算术步骤的计算。您可能会发现您的速度受到数据库访问的限制,您需要缓存数据库访问以使其运行得更快。

于 2012-05-29T00:06:59.430 回答