【问题标题】:Safely serving other people's PHP安全地为其他人的 PHP 服务
【发布时间】:2012-08-28 02:00:47
【问题描述】:

我有一个 Amazon ec2 实例 (linux)。

我希望您(是的,您)能够上传 PHP 文件,然后在 www.mydomain.com/yourname 上实时提供它。我也希望能够为许多其他人做到这一点 (www.mydomain.com/theirname)。

我担心您(或者他们,我们不要指手画脚)可能会(有意或无意地)做出恶意的事情。例如,无限循环,在根目录之外读取/写入,关闭服务器,运行系统命令等。如果我想成为恶意,这就是我会尝试的。

有没有办法设置 PHP/apache/user 权限,或者在提供代码之前搜索他们的代码,这样恶意至少会变得更加困难?

【问题讨论】:

  • 我想说没有绝对安全之类的东西,所以一个好的经验法则是在与您的主应用程序运行的服务器不同的服务器上运行用户提供的代码。此外,最好配备一个负载平衡服务器。

标签: php linux apache security amazon-ec2


【解决方案1】:

除此之外,您肯定需要调整您的 PHP.ini 以包含以下内容:

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

这将阻止在任何使用此 .ini 的 PHP 文件中执行这些函数

我还将启用 open_basedir 支持以将用户锁定在他们自己的目录中,这样他们就不能使用类似的东西:

require_once '../../another_user/index.php';

$notMyFile = file_get_contents('../../another_user/config.php');

【讨论】:

    【解决方案2】:

    没有万无一失的方法。

    首先,没有系统调用。

    其次,每个脚本的超时时间。

    而且,您可能还想在手上保留一个外部“退出按钮”,以便在发现问题时拔掉插头。

    PHP 是一种非常庞大的语言,让其他人在您的服务器上运行代码是一件非常难以安全完成的事情。

    【讨论】:

    • 这就是为什么您可能应该为每个用户/脚本分配一个单独的虚拟机,并在完成后销毁虚拟机。
    • 我仍然可以将 VM 彻底淘汰,并大幅提高您的使用量,这样 EC2 账单就会杀死您。
    【解决方案3】:

    看看 Runkit 沙盒

    实例化 Runkit_Sandbox 类会创建一个具有自己的范围和程序堆栈的新线程。使用传递给构造函数的一组选项,此环境可能会被限制为主要解释器可以执行的操作的子集,并为执行用户提供的代码提供更安全的环境。

    http://php.net/manual/en/runkit.sandbox.php

    请记住,您提供给沙盒环境的任何资源都可能而且最终都会被滥用。例如,如果用户不应该能够影响彼此的结果,而您确实为用户提供了一个数据库,那么在他们的沙箱中为每个用户提供一个具有不同凭据的不同数据库。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多