这是我的情况。我正在构建一个包含一些繁重的数学计算的应用程序,其中公式需要由具有足够特权但不受信任的用户编辑。
我需要一种安全的服务器端脚本语言。我需要能够访问4+数据库表中的常量和值,先前计算的结果,定义用户变量和函数,使用if / then / else语句,我更确定我无法想到正确的现在
我考虑过的一些选项:
我考虑使用像this matheval library这样的东西,但我最终需要为我的用例大大扩展它。我基本上是在创建自己的自定义语言。
PHP runkit sandbox。我之前从未使用过这个,但我非常担心所涉及的安全问题。考虑到可能的安全问题,我认为这不是一个可行的选择。
另一个让我想到的另一个想法是,我不知道是否有可能在服务器端使用类似javascript的东西。我已经看到js在桌面应用程序中用作脚本平台来扩展功能,看起来类似的方法似乎也是可行的。我可以理想地定义运行它的环境,例如禁用文件系统访问等。再次,安全性似乎是一个问题。
从我所做的研究来看,似乎#1可能是我唯一的选择,但我想我会选择一个更大的人才库。 :-)
如果#3是可能的,那似乎是可行的方式,但我似乎无法找到任何有用的东西。另一方面,#2和#3之间可能没有太大区别。
表现是另一个考虑因素。将会有大约65个奇数公式,每个公式执行约450次。每个公式都可以访问大约15个唯一变量,大约有一百个常数,以及之前公式的结果。 (是的,有一个特定的执行顺序。)
我可以使用异步方法进行计算,其中计算将由用户事件启动并存储在数据库中,但不希望这样做。
处理这种情况的最佳方法是什么?我的研究中是否还有其他第三方图书馆?除了我的3还有其他选择我应该考虑吗?
答案 0 :(得分:1)
现在几乎没有理由创建自定义语言。有这么多可用和黑客,写你自己真的是浪费时间。
如果您没有为众多用户提供服务(对于各种各样的价值),大多数现代脚本语言都是可以保证的,特别是如果您愿意采取严厉的措施(例如完全消除I / O)和系统接口)。
JavaScript是一个有效的选项。它可以直接在JS中创建迷你沙箱来运行外部代码。如果你希望人们能够在运行中保持状态,只需要将它们存储在“JSON-like”JS结构中,这些结构可以在退出时从系统中轻松序列化,并且可以轻松地重新加载。这些甚至可以是函数的结果。
如果您不希望它们使用某个函数或例程,则可以在触发外部代码之前取消定义它。不希望他们使用“读取”来读取文件? read = func(s) { }
显然,你应该与你想要使用的JS实现的邮件列表交谈,以获得一些提示,以便更好地保护它。
但JS有很好的支持,有很好的文档记录,并且解释器非常容易访问。
答案 1 :(得分:0)
您有两个基本选择:
a)提供您自己的语言,您可以完全控制所做的事情, 所以没有什么不好的事情可以发生,
b)使用其他一些执行引擎,并检查它所做的一切,以确认没有发生任何不良事件。
我对b)的问题是很难弄清楚有人可能以晦涩的方式做的所有坏事。
我更喜欢a),因为你只需要让他们能够做你允许的事情。
如果您想要处理一组相当简单的公式,那么编写解析器/求值器实际上非常容易。见Is there an alternative for flex/bison that is usable on 8-bit embedded systems?
我不清楚您是否存在性能问题。是的,你想要执行450次;但它包括数据库访问,其成本将主导任何涉及1000个算术步骤的计算。您可能会发现速度受限于数据库访问所需的数据库访问,以使其更快地运行。