亲测有效!如何禁止PHP脚本跨站跨目录

前言

​ 在使用小皮面板时发现PHP木马shell所能访问的目录权限很大,功能上已配置了,但是未生效,后来经过研究php的防跨站跨目录的一个安全配置。

apache

阿帕奇是比较成熟的中间件,我们可以通过修改apache安装目录下的vhost.conf来达到防止跨站跨目录的目的。在网站配置中加入以下代码

<VirtualHost *:80>
php_admin_value open_basedir "/www/wwwroot/:/tmp/:/proc/"
</VirtualHost>

需要把/www/wwwroot/改为你网站所在目录的绝对路径。

值得注意的是如果使用这种方式,那么虚拟用户就不再自动继承php.ini中的open_basedir值了,这样会失去灵活性。

nginx

nginx也可以通过修改配置文件来达到防跨站跨目录的效果。

fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/:/proc/";

​ 通常nginx的站点配置文件里用了include fastcgi.conf;,我们可以把这行加在fastcgi.conf里就OK了。
如果某个站点需要单独设置额外的目录,把上面的代码写在include fastcgi.conf;这行下面就OK了,会把fastcgi.conf中的设置覆盖掉。
这种方式的设置需要重启nginx后生效。

php.ini

实际上脱离中间件,我们完全可以通过php的配置文件来达到防跨站的效果。

在php.ini中修改open_basedir的值

open_basedir=/home/wwwroot/:/tmp/:/proc/

这样php只能访问到我们设置的目录。但是这种办法适用于你的网站根目录是/home/wwwroot,如果你的wwwroot目录下有多个网站并存,如下

域名 路径
a.com /wwwroot/a.com
b.com /wwwroot/b.com
那么入侵者在拿下a.com的shell时仍然可以跨目录到b.com之下。怎么解决?

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录([$_SERVER[‘DOCUMENT_ROOT’]所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。

也就是说我们可以通过.user.ini这种形式来对每一个网站甚至是每一个目录设置open_basedir属性值

首先修改php.ini,去掉user_ini.filenameuser_ini.cache_ttl前面的分号。

;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;
; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini"
user_ini.filename = ".user.ini"

; To disable this feature set this option to empty value
;user_ini.filename =

; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes)
user_ini.cache_ttl = 300

在网站a.com根目录下创建.user.ini加入:

open_basedir=/home/wwwroot/a.com/tmp/:/proc/
小皮面板如果按上面操作,会访问不成功,需要修改一下
open_basedir=/home/wwwroot/a.com/
就行了,经过测试可以达到效果
/home/wwwroot/a.com 是指你的网站绝对路径哦~

这样就可以确保每个网站的php文件只能访问open_basedir属性设置的目录范围了。

关于.user.ini文件的更多详细说明移步

https://www.php.net/manual/zh/configuration.file.per-user.php

特别注意,需要取消掉.user.ini文件的写权限,这个文件只让最高权限的管理员设置为只读。

后记

通过学习apache、nginx和php的一些配置文件和属性来达到安全配置的目的,略有收获。推荐使用.user.ini来配置目录权限。

网站声明: 1.本站大部分资源搜集于网络,仅代表作者观点,如有侵权请提交修改。 2.网站内容仅网站站长做个人学习摘记,任何人不得用于其他商业用途,网站发表的内容全权归原作者所有。 3.有任何疑问,可以点击右侧边栏的联系QQ进行咨询 4.本网站部分内容来自于其他网站平台的,版权归原网站所有,本网站只作信息记录,自己学习使用,特此申明,本站用户也不得使用此信息内容做其他商业用途。
白丁学者 » 亲测有效!如何禁止PHP脚本跨站跨目录

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据