7

我正在开发一个我将有两个非常不同的组件的东西。

此时的结构是
Core:
核心内部的东西
3prty:
第三方开发的东西

现在,我想做的是阻止第三方开发的 php 脚本做类似的事情

scandir("../");

或者

require "../core/anyfile.php";

或者

file_get_contents("../core/SourceCode.php");

有没有办法做到这一点?任何帮助表示赞赏。提前致谢。

我正在运行 Apache,它是我自己的服务器,所以我可以设置任何扩展等。该解决方案必须适用于生产环境,并且我需要能够允许 3rd 方脚本,知道它们可能是恶意的。

4

2 回答 2

1

听起来像为第 3 方目录设置open_basedir会起作用。这不会阻止第 3 方脚本“了解”其他 3P 脚本,但会阻止访问核心或任何外部系统文件。

于 2013-11-14T16:51:17.507 回答
0

这在很大程度上取决于您设置的服务器端配置类型。让我们以 apache 为例,您的 Apache 线程都将作为在 httpd.conf 文件中找到的User指令(通常类似于 _www、www-data 或 apache)中定义的系统用户运行。如果您的项目在任何时候都包含来自供应商的文件,则这些文件将使用与核心文件相同的用户(因此具有相同的权限级别)执行,从而使他们可以读取所有内容。

我相信实现您所提议的唯一方法是完全划分核心库和供应商库,手动更改当前用户,然后将供应商库作为单独的执行执行。供应商需要支持这种交互。但它可能会变得非常讨厌,并且不建议在生产环境中这样做(如果它们是恶意的,可能会被供应商库操纵):

<?php
$restricted_user = 'vendor';
$user_info = posix_getpwnam($restricted_use);

// change the user before executing the external vendor scripts
posix_setuid($user_info['uid']);
posix_setgid($user_info['gid']);

// run the vendor scripts using exec, shell_exec, system, pass_thru...
system('php /path/to/vendor/script.php');

一般来说,在您的服务器上允许您不信任其执行模式的任何可执行代码是一个坏主意。

于 2013-11-14T16:43:07.457 回答