請(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程序安全。

請(qǐng)問:Nginx環(huán)境下應(yīng)該怎么在PHP進(jìn)行安全設(shè)置的圖1

禁用危險(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)指正。

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP