在 PHP 中設置 Cookie 時,若鍵名包含點號(句號),例如 $_COOKIE['my.name'] = 1;,實際存取時會發現無法通過 my.name 獲取值,只能使用 my_name(下劃線)。這並非錯誤,而是 PHP 的內建行為——點號會被自動轉換為下劃線。
這源於 PHP 早期版本的 register_globals 機制。當 register_globals = On 時,超全域變數($_GET、$_POST、$_COOKIE 等)會自動註冊為同名的全域變數。例如 $_COOKIE['my_name'] 會生成 $my_name 變數。但 PHP 變數命名規則不允許點號($my.name 會被解析為 $my 物件的 name 屬性),因此 PHP 將所有超全域陣列的鍵名中的點號強制轉為下劃線,確保能合法映射為變數名。
register_globals 本身是嚴重的安全風險:攻擊者可通過 URL 參數(如 ?a=1)覆蓋腳本內部變數(如 $a 控制登入狀態)。因此 PHP 4.2 起預設關閉,PHP 5.4 起棄用,PHP 6 完全移除。但 Cookie 鍵名的點號轉換行為為了相容性得以保留。
user_name)Q: Cookie 域名設定中 .domain.com 前面的點號是什麼意思?
A: 這是標準 Cookie 域名寫法,表示包含所有子域名(如 www.domain.com、api.domain.com),與鍵名轉換無關。
Q: 域名能用下劃線嗎?
A: 域名規範僅允許字母、數字、連字號(-),不允許下劃線(_)。