Php NGINX-防止目录遍历攻击

Php NGINX-防止目录遍历攻击,php,security,nginx,permissions,Php,Security,Nginx,Permissions,我第一次自己配置web服务器 Ubuntu、NGINX、PHP、SASS等安装有最新更新 创建了自己的用户帐户,因此我不必到处使用root 检查我没有打开不需要的端口 为每个域创建自己的文件夹 每个域在PHP5 fpm池上运行自己的sock,并使用自己的用户名 我的文件夹结构如下所示: /var/www/sites/exampledomain1/public/ /var/www/sites/exampledomain2/public/ /var/www/sites/exampledomain2/

我第一次自己配置web服务器

Ubuntu、NGINX、PHP、SASS等安装有最新更新 创建了自己的用户帐户,因此我不必到处使用root 检查我没有打开不需要的端口 为每个域创建自己的文件夹 每个域在PHP5 fpm池上运行自己的sock,并使用自己的用户名 我的文件夹结构如下所示:

/var/www/sites/exampledomain1/public/

/var/www/sites/exampledomain2/public/

/var/www/sites/exampledomain2/public/

我将test.txt文件发送到每个公用文件夹和/var/,/var/www/。然后我制作了一个简单的php文件,试图包含来自不同位置的test.txt文件,并且我还尝试包含/etc/passwd。我很高兴地注意到,我可以在我的公共PHP文件中包括所有文件,甚至/etc/passwd文件

我创建了域用户,并将其仅放在www数据组中。除了www/以外的一切。。未触及,因此/var/passwd etc是root:root

/var/www/755 www-data:www-data

/var/www/sites/755 www-data:www-data

/var/www/sites/exampledomain1/711 exampledomain1:www数据

/var/www/sites/exampledomain2/711 exampledomain2:www数据

/var/www/sites/exampledomain3/711 exampledomain3:www数据

/var/www/sites/exampledomain1/public 711 exampledomain1:www数据

/var/www/sites/exampledomain2/public 711 exampledomain2:www数据

/var/www/sites/exampledomain3/public 711 exampledomain3:www数据

目前,所有index.php文件都包含701。所有者可以读、写和执行,同一组中的用户不能做任何事情,而public可以执行


我的目标是您不能包含其他文件夹中的任何内容。因此,如果我的一个域有漏洞,被黑客/破解者可以运行自己的代码,因此它不能包含来自其他域或更深层次的任何文件。

要创建绝对隔离的环境,您应该

a使用Apache后端+suexec+mod_php,因为php-fpm不像Apache那样完全支持suexec

b根据您的域,不仅创建单个用户,还创建单个组

c配置几个基于名称的虚拟主机,每个域一个,您已经完成了,并将单个用户名设置为suexec参数


在这种情况下,您对域DocumentRoots的cat setup 0700权限和文件系统权限肯定会将您的域\用户彼此分开。

要创建绝对隔离的环境,您应该

a使用Apache后端+suexec+mod_php,因为php-fpm不像Apache那样完全支持suexec

b根据您的域,不仅创建单个用户,还创建单个组

c配置几个基于名称的虚拟主机,每个域一个,您已经完成了,并将单个用户名设置为suexec参数


在这种情况下,您对域DocumentRoots的cat setup 0700权限和文件系统权限肯定会将您的域\用户彼此分开。

我强烈建议使用PHP-FPM和chrooting。它以Apache/suexec无法做到的方式完全隔离,每个站点都有自己的用户和chroot。这是大型ISP/托管公司使用的一个原因


最好的一点是PHP-FPM对NginX来说也是轻而易举的事。

我强烈推荐PHP-FPM和chrooting。它以Apache/suexec无法做到的方式完全隔离,每个站点都有自己的用户和chroot。这是大型ISP/托管公司使用的一个原因


最好的一点是,PHP-FPM对NginX来说也是轻而易举的事。

感谢您的快速回答!我编辑了php.ini,行open_basedir,并在那里编写了所有OK目录。然后我添加了fastcgi_param PHP_VALUE open_basedir=/var/www/sites/exampledomain1/public;到每个php5 fpm池服务器块。我尝试了我的安全测试php文件,现在它不能包含任何我不想包含的内容。谢谢你的快速回答!我编辑了php.ini,行open_basedir,并在那里编写了所有OK目录。然后我添加了fastcgi_param PHP_VALUE open_basedir=/var/www/sites/exampledomain1/public;到每个php5 fpm池服务器块。我尝试了我的安全测试php文件,现在它不能包含任何我不想包含的内容。