1

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

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

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

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

4

3 回答 3

8

除其他外,您肯定需要调整 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');

于 2012-08-27T17:55:07.597 回答
5

没有万无一失的方法可以做到这一点。

首先,没有系统调用。

其次,每个脚本的超时。

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

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

于 2012-08-27T17:55:52.730 回答
1

看看 Runkit 沙盒

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

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

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

于 2012-08-27T17:56:19.027 回答