1. 程式人生 > >php.ini安全配置禁用危險函式open_basedir防止跨目錄

php.ini安全配置禁用危險函式open_basedir防止跨目錄

disable_functions = phpinfo,chroot,chown,chmod,system,shell_exec,passthru,exec,assert,pcntl_exec,proc_open,``,phpfunc,proc_get_status,chgrp,popen,get_cfg_var
; ###################### 禁用的危險函式 BEGIN #######################################################unlink,readdir,
;disable_functions = phpinfo
;執行提權命令類,chroot,chgrp,chown,ini_set,ini_alter,ini_restore,get_cfg_var popen
;執行系統命令類,exec,passthru,system,shell_exec,popen,
;探測資訊路徑類,phpinfo,chroot,proc_get_status,
;執行越權寫入類,proc_open,error_log,dl,pfsockopen,syslog,readlink,symlink,stream_socket_server,putenv
;"
; ###################### 禁用的危險函式 END #########################################################

修改php.ini的open_basedir防止跨目錄

open_basedir = "c:\WWW;C:\Windows\Temp;C:\Users\APACHE~1.IZ2\AppData\Local\Temp;"

參考文獻

(3) open_basedir: 將使用者可操作的檔案限制在某目錄下; 
——————————————————————————– 
如下是php.ini中的原文說明以及預設配置: 
; open_basedir, if set, limits all file operations to the defined directory 
; and below. This directive makes most sense if used in a per-directory or 


; per-virtualhost web server configuration file. This directive is 
; *NOT* affected by whether Safe Mode is turned On or Off. 
open_basedir = . 

open_basedir可將使用者訪問檔案的活動範圍限制在指定的區域,通常是其家目錄的路徑,也可用符號”.”來代表當前目錄。注意用open_basedir指定的限制實際上是字首,而不是目錄名。 
舉例來說: 若”open_basedir = /dir/user”, 那麼目錄 “/dir/user” 和 “/dir/user1″都是可以訪問的。所以如果要將訪問限制在僅為指定的目錄,請用斜線結束路徑名。例如設定成: 

“open_basedir = /dir/user/” 

open_basedir也可以同時設定多個目錄, 在Windows中用分號分隔目錄,在任何其它系統中用冒號分隔目錄。當其作用於Apache模組時,父目錄中的open_basedir路徑自動被繼承。 

有三種方法可以在Apache中為指定的使用者做獨立的設定: 
(a) 在Apache的httpd.conf中Directory的相應設定方法: 
<Directory /usr/local/apache/htdocs> 
php_admin_value open_basedir /usr/local/apache/htdocs/ 
#設定多個目錄可以參考如下: 
php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/ 
</Directory> 

(b) 在Apache的httpd.conf中VirtualHost的相應設定方法: 
php_admin_value open_basedir /usr/local/apache/htdocs/ 
#設定多個目錄可以參考如下: 
php_admin_value open_basedir /var/www/html/:/var/tmp/ 

(c) 因為VirtualHost中設定了open_basedir之後, 這個虛擬使用者就不會再自動繼承php.ini中的open_basedir設定值了,這就難以達到靈活的配置措施, 所以建議您不要在VirtualHost 中設定此項限制. 例如,可以在php.ini中設定open_basedir = .:/tmp/, 這個設定表示允許訪問當前目錄(即PHP指令碼檔案所在之目錄)和/tmp/目錄. 

請注意: 若在php.ini所設定的上傳檔案臨時目錄為/tmp/, 那麼設定open_basedir時就必須包含/tmp/,否則會導致上傳失敗. 新版php則會提示”open_basedir restriction in effect” 警告資訊, 但move_uploaded_file()函式仍然可以成功取出/tmp/目錄下的上傳檔案,不知道這是漏洞還是新功能.