經過漫長的品質保證(QA)流程,PHP 4.1.0 終於正式發布。開發者可從 PHP 官網下載頁面 取得最新版本。此版本帶來數項關鍵改進,其中最引人注目的莫過於全新的輸入介面、大幅提升的執行效能,以及 Windows 平台上的革命性突破。
此版本具有歷史意義:這是 PHP 歷史上首次釋出中間版本號遞增(4.0.x → 4.1.0),主要原因在於新輸入介面的引入與模組二進位相容性的中斷。
首先必須強調:PHP 4.1.0 完全支援舊版輸入機制,現有應用程式無需修改即可正常運作。但為了安全著想,開發團隊決定棄用 register_globals,並鼓勵開發者在可能情況下將其關閉。
當 register_globals 開啟時,表單、伺服器與環境變數會自動成為全域命名空間一部分,這極易導致安全漏洞。例如:
<?php
if (authenticate_user()) {
$authenticated = true;
}
// ...
?>
惡意使用者可透過表單傳遞 authenticated=1,即便 authenticate_user() 回傳 false,$authenticated 仍會被設為 true。這類漏洞在實務中相當普遍。
為協助開發者在 register_globals 關閉環境下撰寫安全程式,PHP 4.1.0 引入七個特殊超全域陣列,它們在任何作用域皆自動為全域:
| 陣列 | 用途 |
|---|---|
| $ _GET | 包含 GET 方法傳遞的表單變數 |
| $ _POST | 包含 POST 方法傳遞的表單變數 |
| $ _COOKIE | 包含 HTTP Cookie 變數 |
| $ _SERVER | 包含伺服器變數(如 REMOTE_ADDR) |
| $ _ENV | 包含環境變數 |
| $ _REQUEST | GET、POST、Cookie 變數合併(所有來自使用者輸入,安全性不可信) |
| $ _SESSION | 包含 Session 模組註冊的 HTTP 變數 |
這些陣列的特殊性在於:無需宣告 global 即可在任何函數、類別中直接存取。例如:
function example1() {
print $ _GET["name"]; // 直接可用,無需 global $ _GET;
}
完整變更清單請參閱官方發布說明文件末尾區段。