購物車資料 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 = 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 起已移除,現代版本不再有此問題。stripslashes(若 get_magic_quotes_gpc())。addslashes,交給框架/入口統一處理。json_encode/decode 替代 serialize/unserialize,跨語言相容性更好。httponly、secure、samesite 提升安全性。