PHP sandbox / sanitize代码传递给create_function

问题描述 投票:2回答:8

我正在使用create_function在服务器端运行一些用户代码。我正在寻找这两个中的任何一个:

  1. 有没有办法清理传递给它的代码,以防止执行有害的东西?
  2. 或者,有没有办法指定此代码在沙盒环境中运行,以便用户无法使用其他任何东西。

谢谢!

php lambda sandbox create-function
8个回答

3
投票

您可以使用tonkenizer来确定代码将执行的操作,然后将某些功能和操作列入白名单。我认为最终使其变得非常困难(或不可能)使其变得万无一失,特别是考虑到PHP的灵活性:

$f = "shell_exec";
$arg = 'rm -rf /';

$f($arg); // ouch
call_user_func($f, $arg); // ouch
eval("$f('$arg');"); // ouch

$newF = create_user_function('', "$f('$arg');");
$newF(); // ouch

唯一能给你100%安全性的沙箱(好吧,99.9%......)是一个虚拟机,你可以随后扔掉。


3
投票

我们使用tokenizer静态分析代码,并修改代码以对某些事情执行运行时检查。这是通过基于tokenizer的tokenizer和脚本完成的。由于标记化器与PHP实际使用的标记化器相同,因此它可以提高您编写自己的运气。

我见过人们使用正则表达式试图分析一种语言。这是一个非常糟糕的主意。

但......

由于PHP是一个非常简单易懂的语法,并且您可以访问标记化程序,因此您可以通过禁止变量函数来实际阻止大部分错误,并且只允许调用少量白名单函数。如果你不需要OOP,那就更好了。

但是,我们没有足够的信心确保100%的问题得到解决,我们使用它来为后端用户提供沙箱,这些用户是支付客户的,而不是地球上每个使用键盘的用户,也许还有恶意。

我也认为这里的人们把这个想法100%作为“坏习惯”的人需要得到一个线索。有理由这样做。


2
投票

您无法可靠地清理用户输入 - 确定的黑客会发现一些模糊的方法来规避您的清理代码。

沙盒可能是可能的,但同样瘫痪。如果你真的想要安全,你应该为每个电话创建一个沙箱。毕竟,有人可能会执行对您沙盒的所有其他用户有害的虚假代码。

我不认为你真的想要允许。可以这样想:您正在提供对服务器的编程访问!


2
投票

您可以尝试使用基于Java的PHP解释器Quercus来创建安全的沙盒PHP环境。您可以使用Rhino对JavaScript执行相同的操作,因此我认为Quercus可能会这样做。


1
投票

您可以考虑创建一个用户可以使用的自定义(ized)语言。然后由您来创建支持函数库,这些函数很可能只是PHP本机函数的包装器。但即便如此,使其成为防黑客或仅仅工作也是一项繁琐的工作。也许您应该重新评估您希望用户首先获得代码访问权限的原因?如果你需要有人与之讨论(或者更新你的问题,我猜?)我很乐意帮忙

希望你能解决它!

戴夫


1
投票

GitHub上的一个类可能有所帮助,早期阶段但看起来很有希望。

https://github.com/fregster/PHPSandbox


0
投票

无论你采取什么样的保护措施,整体糟糕的想法和太危险的IMO都是如此。最好创建一种仅限于允许用户执行操作的伪语言。

© www.soinside.com 2019 - 2024. All rights reserved.