php - 服务器端执行用户提交的代码

标签 php security eval dsl

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

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

我考虑过的一些选项:

  1. 我考虑过使用类似 this matheval library 的东西但我最终需要为我的用例大大扩展它。我实际上是在创建自己的自定义语言。

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

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

根据我所做的研究,#1 似乎是我唯一的选择,但我想我会与更大的人才库进行核实。 :-)

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

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

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

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

最佳答案

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

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

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

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

显然,您应该与您想要使用的 JS 实现的邮件列表联系,以获得一些更好地保护它的技巧。

但是 JS 有很好的支持,有很好的文档,而且解释器真的很容易访问。

关于php - 服务器端执行用户提交的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791140/

相关文章:

php - ID不能为空(自增)

php - 无法打开流 : Invalid argument

javascript - 如果我有 XSS 保护解决方案,它会导致 chrome auditor 被禁用吗?

macos - 我的 OSX 应用程序应如何存储用户的私钥?

python - 是否有类似反向 eval() 函数的东西?

php - 在 Symfony 2 中使用注释时生成 url 的路由名称

javascript - 我应该在 eval() 中过滤哪些关键字?

javascript - 从传递给函数的字符串调用 javascript 函数

javascript - 在单独的框架中执行 Javascript

php - Google 表格 API v4 创建表格并邀请用户