php中的安全模式
添加時間:2014-7-23 17:07:15
添加:
思海網(wǎng)絡(luò)
被安全模式限制或屏蔽的函數(shù)
PHP 的安全模式是為了試圖解決共享服務(wù)器(shared-server)安全問題而設(shè)立的。在結(jié)構(gòu)上,試圖在 PHP 層上解決這個問題是不合理的,但修改 WEB 服務(wù)器層和操作系統(tǒng)層顯得非常不現(xiàn)實。因此許多人,特別是 ISP,目前使用安全模式。
表格 24-1. 控制安全模式的設(shè)置選項有:
設(shè)置選項 默認(rèn)值
safe_mode Off
safe_mode_gid 0
safe_mode_include_dir ""
safe_mode_exec_dir 1
open_basedir ""
safe_mode_allowed_env_vars PHP_
safe_mode_protected_env_vars LD_LIBRARY_PATH
disable_functions ""
當(dāng) safe_mode 設(shè)置為 on,PHP 將檢查當(dāng)前腳本的擁有者是否和將被文件函數(shù)操作的文件的擁有者相匹配。例如: -rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 .php
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
運行 .php <?php
readfile('/etc/passwd');
?>
如果安全模式被激活,則將會導(dǎo)致以下錯誤: Warning: SAFE MODE Restriction in effect. The whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/.php on line 2
同時,或許會存在這樣的環(huán)境,在該環(huán)境下,寬松的 GID 檢查已經(jīng)足夠,但嚴(yán)格的 UID 檢查反而是不適合的。您可以用 safe_mode_gid 選項來控制這種檢查。如果設(shè)置為 On 則進行寬松的 GID 檢查;設(shè)置為 Off(默認(rèn)值)則進行 UID 檢查。
除了 safe_mode 以外,如果您設(shè)置了 open_basedir 選項,則所有的文件操作將被限制在您指定的目錄下。例如: <Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>
如果您在設(shè)置了 open_basedir 選項后運行同樣的 .php,則其結(jié)果會是: Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/.php on line 2
您也可以單獨地屏蔽某些函數(shù)。請注意 disable_functions 選項不能在 php.ini 文件外部使用,也就是說您無法在 httpd.conf 文件的按不同虛擬主機或不同目錄的方式來屏蔽函數(shù)。 如果我們將如下內(nèi)容加入到 php.ini 文件: disable_functions readfile,system
則我們會得到如下的輸出: Warning: readfile() has been disabled for security reasons in
/docroot/.php on line 2
被安全模式限制或屏蔽的函數(shù)
以下安全模式列表可能不完整或不正確。
表格 24-2. 安全模式限制函數(shù)
函數(shù)名 限制
dbmopen() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
dbase_open() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
filepro() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
filepro_rowcount() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
filepro_retrieve() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
ifx_*() sql_safe_mode 限制, (!= safe mode)
ingres_*() sql_safe_mode 限制, (!= safe mode)
mysql_*() sql_safe_mode 限制, (!= safe mode)
pg_loimport() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
posix_mkfifo() 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
putenv() 遵循 ini 設(shè)置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 選項。請參考 putenv() 函數(shù)的有關(guān)文檔。
move_uploaded_file() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
chdir() 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
dl() 該函數(shù)在安全模式中已被屏蔽。
backtick operator 該函數(shù)在安全模式中已被屏蔽。
shell_exec()(在功能上和 backticks 函數(shù)相同) 該函數(shù)在安全模式中已被屏蔽。
exec() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
system() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
passthru() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
popen() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
mkdir() 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
rmdir() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
rename() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
unlink() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
copy() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (on source and target)
chgrp() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
chown() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
chmod() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 另外,您不能設(shè)置 SUID、SGID 和 sticky bits
touch() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
symlink() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意:僅測試 target)
link() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意:僅測試 target)
getallheaders() 在安全模式下,以“authorization”(區(qū)分大小寫)開頭的頭信息將不會被返回。警告:getallheaders() 無法在 aol-server 下實現(xiàn)!
header() 在安全模式下,如果您設(shè)置了 WWW-Authenticate,當(dāng)前腳本的 uid 將被添加到該頭信息的 realm 部分。
highlight_file(), show_source() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意,僅在 4.2.1 版本后有效)
parse_ini_file() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意,僅在 4.2.1 版本后有效)
PHP 的安全模式是為了試圖解決共享服務(wù)器(shared-server)安全問題而設(shè)立的。在結(jié)構(gòu)上,試圖在 PHP 層上解決這個問題是不合理的,但修改 WEB 服務(wù)器層和操作系統(tǒng)層顯得非常不現(xiàn)實。因此許多人,特別是 ISP,目前使用安全模式。
表格 24-1. 控制安全模式的設(shè)置選項有:
設(shè)置選項 默認(rèn)值
safe_mode Off
safe_mode_gid 0
safe_mode_include_dir ""
safe_mode_exec_dir 1
open_basedir ""
safe_mode_allowed_env_vars PHP_
safe_mode_protected_env_vars LD_LIBRARY_PATH
disable_functions ""
當(dāng) safe_mode 設(shè)置為 on,PHP 將檢查當(dāng)前腳本的擁有者是否和將被文件函數(shù)操作的文件的擁有者相匹配。例如: -rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 .php
-rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
運行 .php <?php
readfile('/etc/passwd');
?>
如果安全模式被激活,則將會導(dǎo)致以下錯誤: Warning: SAFE MODE Restriction in effect. The whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/.php on line 2
同時,或許會存在這樣的環(huán)境,在該環(huán)境下,寬松的 GID 檢查已經(jīng)足夠,但嚴(yán)格的 UID 檢查反而是不適合的。您可以用 safe_mode_gid 選項來控制這種檢查。如果設(shè)置為 On 則進行寬松的 GID 檢查;設(shè)置為 Off(默認(rèn)值)則進行 UID 檢查。
除了 safe_mode 以外,如果您設(shè)置了 open_basedir 選項,則所有的文件操作將被限制在您指定的目錄下。例如: <Directory /docroot>
php_admin_value open_basedir /docroot
</Directory>
如果您在設(shè)置了 open_basedir 選項后運行同樣的 .php,則其結(jié)果會是: Warning: open_basedir restriction in effect. File is in wrong directory in
/docroot/.php on line 2
您也可以單獨地屏蔽某些函數(shù)。請注意 disable_functions 選項不能在 php.ini 文件外部使用,也就是說您無法在 httpd.conf 文件的按不同虛擬主機或不同目錄的方式來屏蔽函數(shù)。 如果我們將如下內(nèi)容加入到 php.ini 文件: disable_functions readfile,system
則我們會得到如下的輸出: Warning: readfile() has been disabled for security reasons in
/docroot/.php on line 2
被安全模式限制或屏蔽的函數(shù)
以下安全模式列表可能不完整或不正確。
表格 24-2. 安全模式限制函數(shù)
函數(shù)名 限制
dbmopen() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
dbase_open() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
filepro() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
filepro_rowcount() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
filepro_retrieve() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
ifx_*() sql_safe_mode 限制, (!= safe mode)
ingres_*() sql_safe_mode 限制, (!= safe mode)
mysql_*() sql_safe_mode 限制, (!= safe mode)
pg_loimport() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
posix_mkfifo() 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
putenv() 遵循 ini 設(shè)置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 選項。請參考 putenv() 函數(shù)的有關(guān)文檔。
move_uploaded_file() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
chdir() 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
dl() 該函數(shù)在安全模式中已被屏蔽。
backtick operator 該函數(shù)在安全模式中已被屏蔽。
shell_exec()(在功能上和 backticks 函數(shù)相同) 該函數(shù)在安全模式中已被屏蔽。
exec() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
system() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
passthru() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
popen() 您只能在 safe_mode_exec_dir 設(shè)置的目錄下進行執(zhí)行操作。基于某些原因,目前不能在可執(zhí)行對象的路徑中使用 ..。
mkdir() 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
rmdir() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
rename() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
unlink() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
copy() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (on source and target)
chgrp() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
chown() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。
chmod() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 另外,您不能設(shè)置 SUID、SGID 和 sticky bits
touch() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。
symlink() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意:僅測試 target)
link() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意:僅測試 target)
getallheaders() 在安全模式下,以“authorization”(區(qū)分大小寫)開頭的頭信息將不會被返回。警告:getallheaders() 無法在 aol-server 下實現(xiàn)!
header() 在安全模式下,如果您設(shè)置了 WWW-Authenticate,當(dāng)前腳本的 uid 將被添加到該頭信息的 realm 部分。
highlight_file(), show_source() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意,僅在 4.2.1 版本后有效)
parse_ini_file() 將檢查您將要操作的文件/目錄與正在執(zhí)行的腳本是否有相同的 UID。 將檢查您將要操作的目錄和正在執(zhí)行的腳本是否有相同的 UID。 (注意,僅在 4.2.1 版本后有效)
任何使用 php4/main/fopen_wrappers.c 的函數(shù) 。
關(guān)鍵字:安全模式、php、服務(wù)器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解