愚弄一个PHP文件,认为它是单独的目录


Fool a PHP file to thinking it is alone in it directory

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

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

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

scandir("../");

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

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

有没有办法做到这一点?任何帮助,不胜感激。提前谢谢。

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

听起来为

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

这在很大程度上取决于您设置的服务器端配置类型。让我们以 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');

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

相关文章: