經過漫長的品質保證流程,PHP 4.1.0 終於釋出了!
[ 英文版 ]
PHP 4.1.0 包含許多重要的改進
如同一些人所注意到的,這個版本具有一定的歷史意義,因為這是我們第一次更新中間的版本號!主要原因有兩個:一是新的輸入介面帶來了前所未有的變革,二是版本支援導致模組不相容。
以下是關於新輸入機制的說明。完整的變更列表請參考 變更記錄。
首先,必須強調的是,無論您在接下來的說明中看到什麼,PHP 4.1.0 **仍然支援**舊版本的輸入機制。舊的應用程式應該可以正常運作,無需修改!
現在,讓我們繼續說明 :)
基於各種原因,啟用 register_globals 的 PHP 程式碼 (例如,表單、伺服器和環境變數會自動成為腳本的全域作用域 [命名空間] 的一部分) 經常容易受到不同程度的攻擊。例如,以下程式碼:
<?php
if (authenticate_user()) {
$authenticated = true;
}
...
?>
可能會有以下漏洞:遠端使用者可以簡單地將 'authenticated' 作為表單變數傳遞,即使 authenticate_user() 返回 false,$authenticated 的值仍然會是 true。這看起來是一個很簡單的例子,但實際上,許多 PHP 應用程式都因為這個缺陷而容易受到攻擊。
雖然可以撰寫安全的 PHP 程式碼,但我們認為 PHP 太容易寫出不安全的程式碼是不可接受的,因此我們決定做出重大改變,並淘汰 register_globals。當然,由於世界上絕大多數的 PHP 程式碼都依賴這個功能,我們永遠不會將其移除,但我們決定鼓勵使用者盡可能不要使用它。
為了協助使用者在關閉 register_globals 的情況下建構 PHP 應用程式,我們新增了一些特殊的變數,可以用來取代舊的全域變數。共有 7 個新的特殊陣列:
除了這些變數包含這些特殊資訊之外,它們在所有作用域中也自動是全域的。這表示您可以從任何地方存取它們,而無需將它們宣告為全域變數。例如:
<?php
function example1()
{
print $_GET["name"]; // 可以正常運作,不需要 'global $_GET;' !
}
?>
會完美運作!我們希望這將有助於將舊程式碼遷移到新程式碼,而且我們相信這將簡化您編寫新程式碼的過程。另一個技巧是,在 $_SESSION 中建立新的項目會自動將它們註冊為工作階段變數,就像您呼叫 session_register() 一樣。這個技巧僅限於工作階段管理模組 - 例如,在 $_ENV 中建立新項目**不會**隱式地執行 put_env()。
PHP 4.1.0 預設情況下仍將 register_globals 設定為 On。這是一個過渡版本,我們鼓勵應用程式開發者,尤其是被廣泛使用的公開應用程式,將他們的應用程式更改為在 register_globals 設定為 Off 的環境中運作。他們顯然應該利用 PHP 4.1.0 提供的新功能,這些功能使這種轉換更加容易。
在 PHP 的下一個「半主要」版本中,新安裝的 PHP 預設情況下應將 register_globals 設定為 Off。不用擔心!現有的安裝,如果 php.ini 檔案中已將 register_globals 設定為 On,則不會受到影響。這只會在您在新機器上安裝 PHP 時影響您(通常如果您是新使用者),而且如果您願意,您仍然可以將其設定為 On。
注意:這些陣列中有一些使用舊名稱,例如:$HTTP_GET_VARS。這些名稱仍然有效,但我們鼓勵使用者遷移到新的名稱,這些名稱更簡短,並且是自動全域的版本。
感謝 Shaun Clowes (shaun at securereality dot com dot au) 揭露這個問題並協助分析。
法文翻譯由 Pierre-Alain Joye (pierre-alain dot joye at wanadoo dot fr) 提供。