什么是PHP安全模式:safe_mode
簡單說,PHP安全模式就是以安全模式運行php。
php的安全模式提供一個基本安全的共享環境,在一個有多個用戶帳戶存在的php開放的web服務器上。當一個web服務器上運行的php打開了安全模式,那么一些函數將被完全的禁止,并且會限制一些可用的功能。
在安全模式下,一些嘗試訪問文件系統的函數功能將被限制。運行web服務器用戶id,如果想要操作某個文件,則必須擁有該文件讀取或者寫入的訪問權 限,實現這個限制功能對于php來說是沒有問題的。
在安全模式開啟的時候,嘗試讀取或者寫入一個本地文件的時候,php將檢查當前訪問用戶是否是該目標文 件的所有者。如果不是所有者,則該操作會被禁止。
(寫入權限:在較低級別的文件訪問權限下,可能會允許讀取或者寫入系統操作系統的文件,通過php的安全 模式實現了防止你操作另外一個用戶文件的操作。當然,一個web服務器可能能夠訪問一個具有全局寫入權限的任意文件。)
當安全模式打開的時候,以下函數列表的功能將會受到限制:
chdir, move_uploaded_file, chgrp, parse_ini_file, chown, rmdir, copy, rename, fopen, require, highlight_file, show_source, include, symlink, link, touch, mkdir, unlink
同樣的,一些php擴展中的函數也將會受到影響。(加載模塊:在安全模式下dl函數將被禁止,如果要加載擴展的話,只能修改php.ini中的擴展選項,在php啟動的時候加載)
在php安全模式打開的時候,需要執行系統程序的時候,必須是在safe_mode_exec_dir選項指定目錄的程序,否則執行將失敗。即使允許執行,那么也會自動的傳遞給escapeshellcmd函數進行過濾。
以下執行命令的函數列表將會受到影響:
exec,shell_exec,passthru,system,popen
另外,背部標記操作符(`)也將被關閉。
當運行在安全模式下,雖然不會引起錯誤,但是putenv函數將無效。同樣的,其他一些嘗試改變php環境變量的函數set_time_limit, set_include_path也將被忽略。
如何開啟PHP安全模式(請注意,PHP5.3將不再有安全模式)
打開或者關閉php的安全模式是利用php.ini中的safe_mode選項:
safe_mode=On(使用安全模式) safe_mode=Off(關閉安全模式)
在apache的httpd.conf中VirtualHost的相應設置方法
php_admin_flag safe_mode On(使用安全模式) php_admin_flag safe_mode Off(關閉安全模式) 或者: php_admin_value safe_mode1(使用安全模式) php_admin_value safe_mode0(關閉安全模式)
啟用安全模式后的影響:
當函數在訪問文件系統的時候將進行文件所有者的檢查。缺省情況下,會檢查該文件所有者的用戶id,當你能夠修改文件所有者的組id(gid)為safe_mode_gid選項所指定的。
如果你有一個共享庫文件在你的系統上,當你碰到需要include或require的時候,那么你可以使用 safe_mode_include_dir選項來設置你的路徑,保證你的代碼正常工作。(包含路徑:如果你想要使用 safe_mode_include_dir選項包含