設(shè)置open_basedir防止跨站攻擊
目錄 隱藏
1 概述
2 寶塔中的open_basedir設(shè)置
3 測試是否生效
4 不支持php框架的解決辦法
概述
通過設(shè)置open_basedir將 PHP 所能打開的文件限制在指定的目錄樹,包括文件本身。本指令不受安全模式打開或者關(guān)閉的影響。
當(dāng)一個腳本試圖打開一個文件時,該文件的位置將被檢查。
當(dāng)文件在指定的目錄樹之外時 PHP 將拒絕打開它。
特別是當(dāng)服務(wù)器上有多個網(wǎng)站時,非常有必要設(shè)置open_basedir,防止黑客跨站攻擊。
寶塔中的open_basedir設(shè)置
在寶塔中設(shè)置open_basedir很方便,如圖所示:
勾選上,則開啟了open_basedir。此時,網(wǎng)站根目錄下將出現(xiàn)一個.user.ini文件,打開該文件,可以看到如下內(nèi)容:
代表該網(wǎng)站擁有操作/www/wwwroot/web/public/和/tmp/這兩個目錄的文件操作權(quán)限,此外的目錄將不允許操作。
測試是否生效
在網(wǎng)站根目錄的上一級目錄(/www/wwwroot/web/)下新建一個文件README.md,隨便填寫一些內(nèi)容。然后在網(wǎng)站根目錄(/www/wwwroot/web/public/)新建一個file.php,內(nèi)容如下:
如果可以正常顯示README.md文件中的內(nèi)容,則代表沒有設(shè)置成功。
如果報錯并顯示false,則代表設(shè)置成功。
不支持php框架的解決辦法
對于thinkphp、laravel等php框架,有一個public目錄,一般需要將網(wǎng)站根目錄設(shè)置為public目錄,public目錄下的index.php為唯一入口文件,但是index.php必然會引入上一級目錄中的文件,如果開啟了open_basedir,就會沒有權(quán)限引入,導(dǎo)致報錯并無法運行。
那么問題來了,如果開啟open_basedir,框架無法運行,如果關(guān)閉open_basedir,就會導(dǎo)致被跨站攻擊的危險。
最好的解決辦法是修改open_basedir的值,在原本的兩個目錄中添加上一級目錄(/www/wwwroot/web/)。
修改后,覆蓋.user.ini文件即可。
如果提示沒有權(quán)限覆蓋是因為該文件默認取消了可修改權(quán)限,可以使用命令 chattr -i .user.ini 解除文件不可更動屬性,之后就可以修改/刪除.user.ini這個文件了
覆蓋后,記得chattr +i .user.ini重新恢復(fù)文件不可更動屬性
