如何在框架上做到让插件运行在沙箱之中,让插件对硬盘的访问权限仅限于它自身的根目录中?

alafafa

问题描述

怎样做到让插件不能访问插件以外的目录

假如我安装了一个插件,这个插件在某个方法里写上了

$path = './plugin';
$files = scandir($path);
var_dump( $files);

这样它就能把整个plugin目录的文件列出来了,除了它自身以外还有别的插件,如我foo插件是zhangsan写的,bar插件是lisi写的,该如何做到zhangsan和lisi写的插件隔离呢,即zhangsan无法去读取plugin/bar下的内容,lisi无法去读取plugin/foo下的内容

492 4 0
4个回答

北月

做不到,除非你 hook 各种 PHP 的内置函数。不然执行一下 shell_exec 或者 exec 函数,只要 webman 的运行用户有权限的东西都能获取到。

  • alafafa 2023-02-28

    所以说webman在框架底层没有办法通过技术手段让某个插件以安全方式运行吗?php是可以通过php.ini来配置网站目录下的php不能访问网站根目录以外的内容的,webman能做到让插件不能访问插件根目录以外的内容吗?
    目前node没有做到限制node_modules目录下的某个包的权限,但是deno做到了,应该不是技术上做的到做不到而是框架的作者想不想这么做吧?

  • 北月 2023-02-28

    你说的是 php.iniopen_basedir 配置项吧,这个主要是针对当前网站整个应用的,而你需要的是限制应用内的某个目录,这个我认为用啥 PHP 框架都做不到。你可以尝试设置一下 open_basedir 看看。

  • nitron 2023-03-01

    技术上做不到,PHP框架都做不到,open_basedir对CLI模式无效

EchoNoch

如果让两个应用插件分别以不同的用户运行,然后在linux系统层限制,可行吗?

喵了个咪

https://www.workerman.net/doc/webman/others/task.html#%E6%96%B0%E5%A2%9EHTTP%E7%AB%AF%E5%8F%A3

感觉文档的这个新开HTTP端口的方案可行。
不同的插件运行在不同的进程,给进程设置特定用户,这样应该可以。

alafafa

如果插件具备了对上层文件夹的访问权限,也就以意味着可以读取当前网站根目录下config/database.php的权限,也就意味着可以操作整个数据库,也可以查看其他插件或根目录app/下的所有源码,万一哪个插件的作者动了点小心思,那么就变成了你花钱买了他的插件,他却拿到了你整个项目的源码和数据库,所以要是能有办法在框架上限制让插件在读取硬盘的能力上仅限于插件自身根目录,读取数据库能力上仅限于以插件标识符为前缀的表就好了

  • nitron 2023-03-03

    使用插件和你使用第三方composer库都是一样的,安全问题需要自己审查,框架没办法做有效的隔离。

年代过于久远,无法发表回答
🔝