Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 服务器端执行用户提交的代码_Php_Security_Eval_Dsl - Fatal编程技术网

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

Php 服务器端执行用户提交的代码,php,security,eval,dsl,Php,Security,Eval,Dsl,这是我的情况。我正在构建一个应用程序,其中包含一些繁重的数学计算,公式需要由具有足够特权但不受信任的用户进行编辑 我需要一个安全的服务器端脚本语言。我需要能够访问4+个数据库表中的常量和值、先前计算的结果、定义用户变量和函数、使用if/then/else语句,并且我确信我现在想不出更多 我考虑过的一些选择: 我已经考虑过使用类似的东西,但是我最终需要在我的用例中对它进行相当大的扩展。我基本上是在创建自己的自定义语言 。我以前从未使用过这个,但我非常担心涉及的安全问题。考虑到可能的安全问题,我认为

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

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

我考虑过的一些选择:

  • 我已经考虑过使用类似的东西,但是我最终需要在我的用例中对它进行相当大的扩展。我基本上是在创建自己的自定义语言

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

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

  • 从我所做的研究来看,似乎#1可能是我唯一的选择,但我想我会与更大的人才库核实一下。:-)

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

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

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


    处理这种情况的最佳方法是什么?有没有其他我在研究中没有发现的第三方图书馆?除了我的3,我还有其他的选择吗?

    < P>你有两个基本的选择:

    a) 提供您自己的语言,您可以完全控制所做的事情, 所以不会有什么坏事发生

    b) 使用其他执行引擎,检查它所做的一切,以验证没有发生任何错误

    我对b)的问题是,很难找出一个人可能以模糊的方式做的所有坏事

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

    如果您有一组非常简单的公式要处理,那么编写解析器/计算器实际上非常容易。看


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

    现在几乎没有理由创建自定义语言。有这么多可用和可黑客,写自己的真的是浪费时间

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

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

    如果有一个函数或例程您不想让它们使用,您可以在启动外部代码之前取消定义它。不想让他们用“读取”来读取文件吗<代码>读取=函数{}

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


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

    Look up node.JS。“另一个我不知道是否可能的想法是在服务器端使用类似javascript的东西。”@MrSmith我不熟悉node.js。你能解释一下吗?从我对node.js的理解来看,它完全可以与PHP相媲美。我不会有与
    eval
    相关的同样的安全问题吗?symfony2 twig有一个DSL工具包,因此你也可以用纯PHP轻松地创建自己的语言。@hakre我使用symfony2开发过应用程序,但对twig的内部结构不太熟悉。我做了一些搜索,找不到您可能引用的内容。你能提供一个链接吗?当然,看看这里:只想提一下,取消定义函数实际上不是保护用户访问这些函数的安全方法。正确的方法是使用沙盒环境,如Node.js的受限子流程或浏览器中的沙盒iframe。在我创建的库中,有一些库简化了任务: