通過對php一些伺服器端特性的配置加強php的安全

2021-03-31 12:50:47 字數 4231 閱讀 3454

前面象shaun clowes和rfp等都比較詳細的介紹了php、cgi程式在程式設計過程中遇到的問題,以及如何通過應用程式漏洞突破系統,這篇文章我們來通過對php的一些伺服器端特性來進行配置加強php的安全。寫cgi指令碼的時候我們的確一定注意各種安全問題,對使用者輸入進行嚴格的過濾,但是常在岸邊走哪有不濕鞋,吃燒餅哪有不掉芝麻,人有失蹄馬有失手,連著名的phpnuke、phpmyadmin等程式都出現過很嚴重的問題,更何況象我等小混混寫的指令碼。所以現在我們假設php指令碼已經出現嚴重問題,比如象前一陣子 phpnuke的可以上傳php指令碼的大問題了,我們如何通過對伺服器的配置使指令碼出現如此問題也不能突破系統。

1、編譯的時候注意補上已知的漏洞

從4.0.5開始,php的mail函式加入了第五個引數,但它沒有好好過濾,使得php應用程式能突破safe_mode的限制而去執行命令。所以使用4.0.5和4.0.6的時候在編譯前我們需要修改php原始碼包裡ext/standard/mail.c檔案,禁止mail函式的第五引數或過濾shell字元。在mail.c檔案的第152行,也就是下面這行:

if (extra_cmd != null) {

後面加上extra_cmd=null;或extra_cmd = php_escape_shell_cmd(extra_cmd);然後編譯php那麼我們就修補了這個漏洞。

2、修改php.ini配置檔案

以php發行版的php.ini-dist為藍本進行修改。

1)error handling and logging

在error handling and logging部分可以做一些設定。先找到:

display_errors = on

php預設是開啟錯誤資訊顯示的,我們把它改為:

display_errors = off

關閉錯誤顯示後,php函式執行錯誤的資訊將不會再顯示給使用者,這樣能在一定程度上防止攻擊者從錯誤資訊得知指令碼的物理位置,以及一些其它有用的資訊,起碼給攻擊者的黑箱檢測造成一定的障礙。這些錯誤資訊可能對我們自己有用,可以讓它寫到指定檔案中去,那麼修改以下:

log_errors = off

改為:

log_errors = on

以及指定檔案,找到下面這行:

;error_log = filename

去掉前面的;注釋,把filename改為指定檔案,如/usr/local/apache/logs/php_error.log

error_log = /usr/local/apache/logs/php_error.log

這樣所有的錯誤都會寫到php_error.log檔案裡。

2)safe mode

php的safe_mode功能對很多函式進行了限制或禁用了,能在很大程度解決php的安全問題。在safe mode部分找到:

safe_mode = off

改為:

safe_mode = on

這樣就開啟了safe_mode功能。象一些能執行系統命令的函式shell_exec()和``被禁止,其它的一些執行函式如:exec(), system(), passthru(), popen()將被限制只能執行safe_mode_exec_dir指定目錄下的程式。如果你實在是要執行一些命令或程式,找到以下:

safe_mode_exec_dir =

指定要執行的程式的路徑,如:

safe_mode_exec_dir = /usr/local/php/exec

然後把要用的程式拷到/usr/local/php/exec目錄下,這樣,象上面的被限制的函式還能執行該目錄裡的程式。

關於安全模式下受限函式的詳細資訊請檢視php主站的說明:

如果你對一些函式的危害性不太清楚,而且也沒有使用,索性把這些函式禁止了。找到下面這行:

disable_functions =

在」=「後面加上要禁止的函式,多個函式用」,「隔開。

3、修改httpd.conf

如果你只允許你的php指令碼程式在web目錄裡操作,還可以修改httpd.conf檔案限制php的操作路徑。比如你的web目錄是/usr/local/apache/htdocs,那麼在httpd.conf裡加上這麼幾行:

php_admin_value open_basedir /usr/local/apache/htdocs

這樣,如果指令碼要讀取/usr/local/apache/htdocs以外的檔案將不會被允許,如果錯誤顯示開啟的話會提示這樣的錯誤:

warning: open_basedir restriction in effect. file is in wrong directory in

/usr/local/apache/htdocs/open.php on line 4 等等。

4、對php**進行編譯

zend對php的貢獻很大,php4的引擎就是用zend的,而且它還開發了zendoptimizer和zendencode等許多php的加強元件。優化器zendoptimizer只需在http://.zend.***註冊就可以免費得到,下面幾個是用於4.0.5和4.0.6的zendoptimizer,檔名分別對於各自的系統:

zendoptimizer-1.1.0-php_4.0.5-freebsd4.0-i386.tar.gz

zendoptimizer-1.1.0-php_4.0.5-linux_glibc21-i386.tar.gz

zendoptimizer-1.1.0-php_4.0.5-solaris-sparc.tar.gz

zendoptimizer-1.1.0-php_4.0.5-windows-i386.zip

優化器的安裝非常方便,包裡面都有詳細的說明。以unix版本的為例,看清作業系統,把包裡的zendoptimizer.so檔案解壓到乙個目錄,假設是/usr/local/lib下,在php.ini裡加上兩句:

zend_optimizer.optimization_level=15

zend_extension="/usr/local/lib/zendoptimizer.so" 就可以了。用phpinfo()看到zend圖示左邊有下面文字:

那麼,優化器已經掛接成功了。

php指令碼編譯後,指令碼的執行速度增加不少,指令碼檔案只能看到一堆亂碼,這將阻止攻擊者進一步分析服

務器上的指令碼程式,而且原先在php指令碼裡以明文儲存的口令也得到了保密,如mysql的口令。不過在伺服器端改指令碼就比較麻煩了,還是本地改好再上傳吧。

5、檔案及目錄的許可權設定

web目錄裡除了上傳目錄,其它的目錄和檔案的許可權一定不能讓nobody使用者有寫許可權。否則,攻擊者可以修改主頁檔案,所以web目錄的許可權一定要設定好。

還有,php指令碼的屬主千萬不能是root,因為safe_mode下讀檔案的函式被限制成被讀檔案的屬主必須和當前執行指令碼的屬主是一樣才能被讀,否則如果錯誤顯示開啟的話會顯示諸如以下的錯誤:

warning: safe mode restriction in effect. the script whose uid is 500 is not

allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php

on line 3

這樣我們能防止許多系統檔案被讀,比如:/etc/passwd等。

上傳目錄和上傳指令碼的屬主也要設成一樣,否則會出現錯誤的,在safe_mode下這些要注意。

6、mysql的啟動許可權設定

su mysqladm -c "/usr/local/mysql/share/mysql/mysql.server start"

這樣系統重啟後,也會自動用mysqladmin使用者啟動mysql程序。

7、日誌檔案及上傳目錄的審核及

檢視日誌和人的惰性有很大關係,要從那麼大的日誌檔案裡查詢攻擊痕跡有些大海撈針,而且也未必有。

web上傳的目錄裡的檔案,也應該經常檢查,也許程式有問題,使用者傳上了一些非法的檔案,比如執行指令碼等。

8、作業系統自身的補丁

一樣,給系統打已知漏洞的補丁是系統管理員最基本的職責,這也是最後一道防線。

經過以上的配置,雖然說不上固若金湯,但是也在相當程度上給攻擊者的測試造成很多麻煩,即使php指令碼程式出現比較嚴重的漏洞,攻擊者也無法造成實際性的破壞。

如果您還有更古怪,更**的配置方法,希望能一起分享分享;)

伺服器端PHP允許跨域

解決跨域的關鍵是設定access control allow origin。例如 客戶端的網域名稱是 api.itbsl.com,而請求的網域名稱是www.itbsl.com 如果直接使用ajax訪問,會有以下錯誤 1.允許單個網域名稱訪問 指定某網域名稱跨域訪問,則只需在檔案頭部新增如下 head...

伺服器端的概念

客戶端 在瀏覽器中執行的部分,就是使用者看到並與之互動的介面程式。使用html css js構建 服務端 在伺服器中執行的部分,負責儲存資料和處理應用邏輯 能夠提供 訪問服務的機器就是伺服器,它能夠接收客戶端的請求,能夠對請求做出響應 ip位址是網際網路中裝置中的唯一標識。ip是internet p...

php伺服器端返回一組資料

該檔案返回雙方的聊天記錄 require class dboperation.php require globle.php 聯絡人物件,屬性與客戶端一致 class contact 接受客戶端的字段值,來查詢表 sendervar post sender receivervar post recei...