设置open_basedir防止跨站攻击

概述

通过设置open_basedir将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。
当一个脚本试图打开一个文件时,该文件的位置将被检查。
当文件在指定的目录树之外时 PHP 将拒绝打开它。

特别是当服务器上有多个网站时,非常有必要设置open_basedir,防止黑客跨站攻击。

宝塔中的open_basedir设置

在宝塔中设置open_basedir很方便,如图所示:

勾选上,则开启了open_basedir。此时,网站根目录下将出现一个.user.ini文件,打开该文件,可以看到如下内容:

open_basedir=/www/wwwroot/web/public/:/tmp/

代表该网站拥有操作/www/wwwroot/web/public//tmp/这两个目录的文件操作权限,此外的目录将不允许操作。

测试是否生效

在网站根目录的上一级目录(/www/wwwroot/web/)下新建一个文件README.md,随便填写一些内容。然后在网站根目录(/www/wwwroot/web/public/)新建一个file.php,内容如下:

<?php
$content = file_get_contents("../README.md");
var_dump($content);die;

如果可以正常显示README.md文件中的内容,则代表没有设置成功。
如果报错并显示false,则代表设置成功。

不支持php框架的解决办法

对于thinkphp、laravel等php框架,有一个public目录,一般需要将网站根目录设置为public目录,public目录下的index.php为唯一入口文件,但是index.php必然会引入上一级目录中的文件,如果开启了open_basedir,就会没有权限引入,导致报错并无法运行。

那么问题来了,如果开启open_basedir,框架无法运行,如果关闭open_basedir,就会导致被跨站攻击的危险。
最好的解决办法是修改open_basedir的值,在原本的两个目录中添加上一级目录(/www/wwwroot/web/)。

open_basedir=/www/wwwroot/web/public/:/tmp/:/www/wwwroot/web/

修改后,覆盖.user.ini文件即可。
如果提示没有权限覆盖是因为该文件默认取消了可修改权限,可以使用命令 chattr -i .user.ini 解除文件不可更动属性,之后就可以修改/删除.user.ini这个文件了
覆盖后,记得chattr +i .user.ini重新恢复文件不可更动属性

发表评论

邮箱地址不会被公开。 必填项已用*标注