HTTP 協定原生不支援陣列傳遞,常見解決方案是將陣列序列化後經 Base64 編碼放入 URL 參數。本文詳細說明編碼/解碼流程、安全性考量與現代替代方案。
// 發送端:陣列 → 序列化 → Base64 → URL 參數
$information = ['name' => '張三', 'age' => 25, 'city' => '台北'];
$encoded = base64_encode(serialize($information));
echo "<a href='2.php?info={$encoded}'>查看資訊</a>";
// 輸出:2.php?info=YTozOntzOjQ6Im5hbWUiO3M6Njoi5Lit5paH... (Base64 字串)
// 接收端:URL 參數 → Base64 解碼 → 反序列化 → 陣列
if (isset($_GET['info'])) {
// 重要:解碼順序必須相反!先 base64_decode 再 unserialize
$info = unserialize(base64_decode($_GET['info']));
// 現在可正常存取陣列元素
echo "姓名:" . $info['name'] . "<br>"; // 張三
echo "年齡:" . $info['age'] . "<br>"; // 25
echo "城市:" . $info['city'] . "<br>"; // 台北
}
serialize → base64_encode,解碼時 base64_decode → unserialize,順序顛倒會導致資料損毀+、/、=,需搭配 urlencode() 或使用 base64url_encode() (PHP 7+)unserialize() 可能觸發物件注入攻擊,嚴禁反序列化不可信資料// 編碼(安全、跨語言相容) $encoded = rtrim(strtr(base64_encode(json_encode($data)), '+/', '-_'), '='); // 解碼 $json = base64_decode(strtr($encoded, '-_', '+/')); $data = json_decode($json, true); // 關聯陣列模式
$_SESSION,URL 僅傳遞 Token<input type="hidden" name="data" value="...">| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| serialize+base64 | 簡單內部跳轉、非敏感資料 | PHP 原生、支援物件 | 不安全、長度長、編碼字元問題 |
| JSON+base64url | 跨語言、前後端分離 | 安全、標準化、無特殊字元 | 不支援 PHP 物件、需額外處理填補 |
| Session/DB | 大型資料、敏感資訊、安全關鍵 | 安全、無長度限制、可審計 | 需伺服器端儲存、增加複雜度 |