register_globals = On:將 EGPCS (Environment/Get/Post/Cookie/Server) 變數自動註冊為全域變數。極其危險:攻擊者可覆蓋任何未初始化變數,導致權限繞過、SQL 注入、代碼執行。PHP 5.4 已移除。session.auto_start = 1:每請求自動啟動 Session。副作用:阻礙物件序列化、衝突自定義 Session 處理器、干擾 REST API/無狀態服務、增加不必要開銷。php.ini (位置:php --ini 查看):register_globals = Off
session.auto_start = 0
systemctl restart httpd / apachectl -k restartsystemctl restart php-fpmiisresetphp -i | grep -E "register_globals|session.auto_start" 或 phpinfo()。在網站根目錄建立 .user.ini:
register_globals = Off
session.auto_start = 0
生效延遲:受 user_ini.cache_ttl 控制 (預設 300 秒),修改後等待或重啟 PHP-FPM (若有權限)。
php_flag register_globals Off
php_flag session.auto_start Off
<?php
// 放入所有入口檔案最頂部 (如 common.inc.php、config.php、index.php)
ini_set('session.auto_start', 0);
// register_globals 在 PHP 5.4+ 已移除,無需處理;舊版無法用 ini_set 關閉
?>
發工單要求主機商在全域 php.ini 關閉兩項,正規商家通常預設已關閉。
舊代碼常含如下守衛邏輯:
// 禁止 session.auto_start
if ( ini_get('session.auto_start') != 0 ) {
exit('php.ini session.auto_start must is 0 ! ');
}
修正建議:
1. 優先修正環境配置 (上述方案),不要刪除此檢查——它是安全防線。
2. 若確已在 php.ini/.user.ini 關閉但仍報錯,檢查:
- 配置檔路徑是否正確 (php --ini)。
- 是否有多個 php.ini 生效 (Apache vs CLI)。
- .user.ini 快取未過期 (等待或重啟)。
3. 實在無法修正環境 (極舊虛擬主機),將 exit 改為觸發錯誤日誌並繼續執行,避免直接白屏:
if ( ini_get('session.auto_start') != 0 ) {
error_log('WARNING: session.auto_start is On, may cause issues. Request: '.$_SERVER['REQUEST_URI']);
// ini_set('session.auto_start', 0); // 嘗試關閉
}
| 項目 | 預期值 | 檢查指令 |
|---|---|---|
| register_globals | Off | php -i | grep register_globals |
| session.auto_start | 0 | php -i | grep session.auto_start |
| expose_php | Off | php -i | grep expose_php |
| display_errors | Off (生產) | php -i | grep display_errors |
| log_errors | On | php -i | grep log_errors |
| error_log | 指定路徑 | php -i | grep error_log |
| open_basedir | 限制目錄 | php -i | grep open_basedir |
| disable_functions | exec,shell_exec,system,passthru,popen,proc_open,... | php -i | grep disable_functions |
| disable_classes | 無 | php -i | grep disable_classes |