register_globals 是 PHP 配置指令,控制外部變量(如 $_GET、$_POST、$_COOKIE 等)是否自動註冊為全局變量。自 PHP 4.2.0 起,預設值改為 Off,這是為了提升安全性。
當 register_globals = On 時,用戶提交的表單數據、URL 參數、Cookie 等會直接變成全局變量(如 $username、$password),無需通過超全局數組獲取。這極易導致安全漏洞:攻擊者可通過構造參數覆蓋內部變量,繞過權限檢查。
<?php
// 危險代碼:未初始化 $authorized 直接判斷
if ($username == 'admin' && $password == 'secret') {
$authorized = true;
}
if (!$authorized) {
// 顯示登錄表單
} else {
// 顯示機密內容
}
?>
攻擊者只需訪問 ?authorized=1 即可繞過驗證,因為 $authorized 被自動註冊為全局變量並賦值 1。
DedeCMS 在 include/common.inc.php 中強制要求 register_globals = Off。若您的空間不支持修改 php.ini,可嘗試以下方法:
register_globals = Off
修改後重啟 Apache 生效。
在網站根目錄創建或編輯 .htaccess,添加:
php_flag register_globals off
ini_set('register_globals', '0');
放在入口文件最開頭。
編輯 include/common.inc.php,刪除或註釋以下代碼:
if(ini_get('register_globals')){
exit('<a href="https://docs.dedecms.com/doku.php?id=register_globals">php.ini register_globals must is Off! </a>');
}
警告:這會降低系統安全性,僅作為臨時應急。
| 表單 Method | 獲取方式 |
|---|---|
| GET | $_GET['user_name'] |
| POST | $_POST['user_name'] |
切勿直接使用 $user_name,必須顯式從超全局數組取值。
部分舊項目依賴 On 風格編寫,升級後出現「Undefined index/variable」錯誤。可在公共配置文件(如 config.inc.php)中加入兼容代碼模擬 On 行為:
<?php
if (!ini_get("register_globals")) {
extract($_POST);
extract($_GET);
extract($_SERVER);
extract($_FILES);
extract($_ENV);
extract($_COOKIE);
if (isset($_SESSION)) {
extract($_SESSION);
}
}
?>
注意:此代碼僅緩解兼容性問題,不保證 100% 可用,且會重新引入安全風險,建議逐步重構代碼改用超全局數組。
直接使用未定義的數組鍵或變量,如 $act = $_POST['act']; 當 act 不存在時觸發 Notice。
error_reporting = E_ALL & ~E_NOTICE
或運行時代碼:ini_set("error_reporting", "E_ALL & ~E_NOTICE");
display_errors = Off
isset() 或 empty() 判斷:$act = isset($_POST['act']) ? $_POST['act'] : '';function _get($key) {
return isset($_GET[$key]) ? $_GET[$key] : null;
}
function _post($key) {
return isset($_POST[$key]) ? $_POST[$key] : null;
}
$act = $_POST['act'] ?? '';register_globals = Off。$_GET、$_POST、$_REQUEST 等超全局數組獲取外部輸入。display_errors,記錄錯誤日誌而非直接輸出。掌握 register_globals 的機制與風險,是寫出安全 PHP 代碼的基礎功課。從今天起,堅持「Off 風格」編程,為項目築起第一道防線。