首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP Cookie 鍵名包含點號自動轉換為下劃線的機制解析

     編輯:PHP 綜合知識

現象

<?php
$_COOKIE['user.name'] = 'test'; // 設置
echo $_COOKIE['user_name'];     // 實際讀取鍵名為 user_name
?>

設置 user.name,實際存儲與讀取鍵名變為 user_name (點號 → 下劃線)。

根本原因

歷史遺留:PHP 早期支援 register_globals = On,將 $_GET/$_POST/$_COOKIE 等超全局變量自動註冊為全局變量。變量命名規則不允許點號 ($user.name 語法錯誤),因此 PHP 在導入超全局數據時,統一將點號轉換為下劃線。

影響範圍

  • $_GET
  • $_POST
  • $_COOKIE
  • $_REQUEST
  • $_SERVER (部分鍵名)

注意:$_FILES、$_ENV、$_SESSION 不受影響。

驗證代碼

<?php
// 測試頁: test.php?user.name=abc
var_dump($_GET);     // ['user_name' => 'abc']
var_dump($_COOKIE);  // 若 cookie 有 user.name,鍵名為 user_name

安全隱患歷史

register_globals 導致嚴重安全問題:

<?php
// 老代碼
if ($is_admin) { ... } // 未初始化 $is_admin

// 攻擊請求: test.php?is_admin=1
// 直接覆蓋 $is_admin = '1',繞過權限檢查

PHP 5.4 移除 register_globals,PHP 6 計劃中已廢棄。但點號轉換行為為兼容性保留至今。

最佳實踐

  1. Cookie/參數命名統一使用下劃線:user_name、user_id
  2. 讀取時使用轉換後鍵名:$name = $_COOKIE['user_name'];
  3. 勿依賴原始鍵名:$_COOKIE['user.name'] 永遠不存在
  4. 關閉 register_globals:php.ini: register_globals = Off (現代 PHP 預設關閉)

框架層面處理

現代框架 (Laravel/Symfony/ThinkPHP) 的 Request 物件已封裝參數獲取,開發者無需關心底層轉換:

// Laravel
$name = $request->input('user.name'); // 支援點號語法訪問嵌套數據
$name = $request->cookie('user_name'); // 直接獲取 cookie

總結

點號轉下劃線是 PHP 為兼容已廢棄的 register_globals 保留的歷史行為。理解其由來,遵循下劃線命名規範,使用框架封裝層,即可避免相關坑點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved