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

PHP magic_quotes_gpc 導致 unserialize 失效分析與修正

     編輯:PHP 綜合知識

現象

購物車資料 serialize($arr) 存入 Cookie,讀取時 unserialize($_COOKIE['cart']) 失敗。開啟 magic_quotes_gpc=On 時,Cookie 內單引號被自動加反斜線,導致序列化字串結構破壞:

原始:a:1:{i:0;a:2:{s:8:"goods_id";i:13;s:6:"number";i:1;}}
變為:a:1:{i:0;a:2:{s:8:\"goods_id\";i:13;s:6:\"number\";i:1;}}

根因

magic_quotes_gpc 會對 GET/POST/COOKIE 自動 addslashes。反序列化前必須先 stripslashes 還原。

修正方法

$data = unserialize(stripslashes($_COOKIE['cart']));

通用處理模式

function gpc_stripslashes($v) {
    return is_array($v) ? array_map('gpc_stripslashes', $v) : stripslashes($v);
}
if (get_magic_quotes_gpc()) {
    $_GET    = gpc_stripslashes($_GET);
    $_POST   = gpc_stripslashes($_POST);
    $_COOKIE = gpc_stripslashes($_COOKIE);
    $_REQUEST = gpc_stripslashes($_REQUEST);
}

放在入口檔案(如 index.php)最開頭,後續程式碼直接使用原始資料。

JSON + Cookie 同理

$json = json_encode($arr);
setcookie('data', $json);
// 讀取
$data = json_decode(stripslashes($_COOKIE['data']), true);
// 或
$data = json_decode(str_replace('\\', '', $_COOKIE['data']), true);

版本提醒

  • magic_quotes_gpc 自 PHP 5.4.0 起已移除,現代版本不再有此問題。
  • 若維護舊專案(PHP 5.3-), 必須在入口統一處理;升級 PHP 版本後可移除相容代碼。

最佳實踐總結

  1. 入口檔案統一 stripslashes(若 get_magic_quotes_gpc())。
  2. 儲存序列化/JSON 資料到 Cookie/Session 前不要手動 addslashes,交給框架/入口統一處理。
  3. 改用 json_encode/decode 替代 serialize/unserialize,跨語言相容性更好。
  4. Cookie 設定 httponly、secure、samesite 提升安全性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved