請(qǐng)問:Nginx環(huán)境下應(yīng)該怎么在PHP進(jìn)行安全設(shè)置
當(dāng)下Nginx越發(fā)流行,寶塔面板、Oneinstack、LNMP等集成環(huán)境大多數(shù)都使用Nginx作為WEB服務(wù),Nnginx + PHP情況下使用FPM(FastCGI 進(jìn)程管理器)來執(zhí)行PHP,這篇文章拋開PHP程序?qū)懛ú粐?yán)謹(jǐn)造成的本身漏洞,單從WEB服務(wù)和PHP本身設(shè)置來加強(qiáng)PHP程序安全。

禁用危險(xiǎn)函數(shù)
PHP提供的system()等函數(shù)可以直接執(zhí)行系統(tǒng)命令,如果程序限制不嚴(yán)謹(jǐn)或?qū)懛ú灰?guī)范,被駭客利用是非常危險(xiǎn)的,禁用此類較為危險(xiǎn)的函數(shù)非常有必要。需要修改php.ini,添加如下內(nèi)容:
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen
防止跨站攻擊
跨站攻擊通常表現(xiàn)為A網(wǎng)站被黑之后,駭客利用腳本再次訪問B網(wǎng)站或其它目錄,最終可能導(dǎo)致所有網(wǎng)站全部淪陷。
open_basedir 參數(shù)將php所能打開的文件限制在指定的目錄樹中,包括文件本身。當(dāng)程序要使用例如fopen()或file_get_contents()打開一個(gè)文件時(shí),這個(gè)文件的位置將會(huì)被檢查。當(dāng)文件在指定的目錄樹之外,程序?qū)⒕芙^打開。open_basedir設(shè)置的方法比較多,這里列出幾個(gè)常用的。
php.ini設(shè)置
可以直接修改php.ini直接加入
open_basedir="指定目錄"
從PHP腳本上設(shè)置
在程序腳本上限制:
ini_set('open_basedir', '指定目錄');
通過.user.ini 進(jìn)行設(shè)置
先來看看官方具體是如何解釋.user.ini這個(gè)文件的:
自 PHP 5.3.0 起,PHP 支持基于每個(gè)目錄的 .htaccess 風(fēng)格的 INI 文件。此類文件僅被 CGI/FastCGI SAPI 處理。此功能使得 PECL 的 htscanner 擴(kuò)展作廢。如果使用 Apache,則用 .htaccess 文件有同樣效果。
除了主 php.ini 之外,PHP 還會(huì)在每個(gè)目錄下掃描 INI 文件,從被執(zhí)行的 PHP 文件所在目錄開始一直上升到 web 根目錄($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被執(zhí)行的 PHP 文件在 web 根目錄之外,則只掃描該目錄。
在 .user.ini 風(fēng)格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 設(shè)置可被識(shí)別。
簡(jiǎn)而言之,也就是說當(dāng)PHP以CGI/FastCGI SAPI方式運(yùn)行時(shí),會(huì)去讀取一個(gè).user.ini的配置,我們可以在這里面設(shè)定open_basedir參數(shù)來防止跨站。
在站點(diǎn)根目錄下新建一個(gè).user.ini,內(nèi)容如下:
open_basedir=/data/wwwroot/:/tmp/:/proc/
為防止.user.ini被篡改,可以給這個(gè)文件加上隱藏屬性。
chattr +i .user.ini
目前已知的寶塔面板,軍哥LNMP(lnmp.org)默認(rèn)使用.user.ini來防止跨站,這個(gè)方式非常靈活,可以針對(duì)某個(gè)網(wǎng)站單獨(dú)設(shè)置。
禁止部分目錄執(zhí)行PHP
大多數(shù)PHP框架,如CodeIgniter、ThinkPHP都是單一入口,只需要index.php有入口權(quán)限程序就能正常運(yùn)行。上傳目錄、靜態(tài)文件目錄完全沒必須要賦予PHP執(zhí)行權(quán)限,否則反而可能被利用。nginx可以通過下面的規(guī)則來禁止某個(gè)目錄執(zhí)行PHP:
#uploads|templets|data 這些目錄禁止執(zhí)行PHPlocation ~* ^/(uploads|templets|data)/.*.(php|php5)$ { return 444;}
其它說明
以上主要是針對(duì)PHP本身設(shè)置和Nginx上進(jìn)行限制,若有不足還請(qǐng)指正。
工程師必備
- 項(xiàng)目客服
- 培訓(xùn)客服
- 平臺(tái)客服
TOP




















