设置open_basedir防止跨站攻击
目录 隐藏
1 概述
2 宝塔中的open_basedir设置
3 测试是否生效
4 不支持php框架的解决办法
概述
通过设置open_basedir将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。
当一个脚本试图打开一个文件时,该文件的位置将被检查。
当文件在指定的目录树之外时 PHP 将拒绝打开它。
特别是当服务器上有多个网站时,非常有必要设置open_basedir,防止黑客跨站攻击。
宝塔中的open_basedir设置
在宝塔中设置open_basedir很方便,如图所示:
勾选上,则开启了open_basedir。此时,网站根目录下将出现一个.user.ini
文件,打开该文件,可以看到如下内容:
代表该网站拥有操作/www/wwwroot/web/public/
和/tmp/
这两个目录的文件操作权限,此外的目录将不允许操作。
测试是否生效
在网站根目录的上一级目录(/www/wwwroot/web/)下新建一个文件README.md
,随便填写一些内容。然后在网站根目录(/www/wwwroot/web/public/)新建一个file.php
,内容如下:
如果可以正常显示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/)。
修改后,覆盖.user.ini
文件即可。
如果提示没有权限覆盖是因为该文件默认取消了可修改权限,可以使用命令 chattr -i .user.ini
解除文件不可更动属性,之后就可以修改/删除.user.ini这个文件了
覆盖后,记得chattr +i .user.ini
重新恢复文件不可更动属性