Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

PHP register_globals 與 session.auto_start 安全配置:獨立伺服器與虛擬主機雙軌修復指南

編輯:關於伺服器

風險背景

  • register_globals = On:將 EGPCS (Environment/Get/Post/Cookie/Server) 變數自動註冊為全域變數。極其危險:攻擊者可覆蓋任何未初始化變數,導致權限繞過、SQL 注入、代碼執行。PHP 5.4 已移除。
  • session.auto_start = 1:每請求自動啟動 Session。副作用:阻礙物件序列化、衝突自定義 Session 處理器、干擾 REST API/無狀態服務、增加不必要開銷。

場景一:獨立伺服器 / VPS / 雲主機 (有 php.ini 權限)

  1. 編輯 php.ini (位置:php --ini 查看):
    register_globals = Off
    session.auto_start = 0
  2. 重啟 Web 服務:
      - Apache: systemctl restart httpd / apachectl -k restart
      - Nginx + PHP-FPM: systemctl restart php-fpm
      - IIS: iisreset
  3. 驗證:php -i | grep -E "register_globals|session.auto_start" 或 phpinfo()。

場景二:虛擬主機 / 共享主機 (無 php.ini 權限)

方案 A:.user.ini (PHP 5.3+、CGI/FastCGI 模式)

在網站根目錄建立 .user.ini:

register_globals = Off
session.auto_start = 0

生效延遲:受 user_ini.cache_ttl 控制 (預設 300 秒),修改後等待或重啟 PHP-FPM (若有權限)。

方案 B:.htaccess (Apache + mod_php)

php_flag register_globals Off
php_flag session.auto_start Off

方案 C:運行時覆蓋 (最後手段,不推薦)

<?php
// 放入所有入口檔案最頂部 (如 common.inc.php、config.php、index.php)
ini_set('session.auto_start', 0);
// register_globals 在 PHP 5.4+ 已移除,無需處理;舊版無法用 ini_set 關閉
?>

方案 D:聯繫空間商

發工單要求主機商在全域 php.ini 關閉兩項,正規商家通常預設已關閉。

遺留代碼兼容性處理 (Discuz!/ECShop/舊版 CMS 常見)

舊代碼常含如下守衛邏輯:

// 禁止 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 + session.auto_start=0 是 PHP 安全基線的「雙保險」。
有權限改 php.ini,無權限改 .user.ini/.htaccess,實在不行找空間商。
保留代碼層守衛邏輯,它是最後一道防線。
定期跑基線檢查清單,防範配置漂移、版本升級導致的安全退化。

Copyright © Windows教程網 All Rights Reserved
項目預期值檢查指令
register_globalsOffphp -i | grep register_globals
session.auto_start0php -i | grep session.auto_start
expose_phpOffphp -i | grep expose_php
display_errorsOff (生產)php -i | grep display_errors
log_errorsOnphp -i | grep log_errors
error_log指定路徑php -i | grep error_log
open_basedir限制目錄php -i | grep open_basedir
disable_functionsexec,shell_exec,system,passthru,popen,proc_open,...php -i | grep disable_functions
disable_classes無php -i | grep disable_classes