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

PHP 透過 URL 傳遞陣列:serialize + base64 編碼方案

     編輯:PHP 綜合知識

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>";   // 台北
}

關鍵注意事項

  1. 順序嚴格:編碼時 serialize → base64_encode,解碼時 base64_decode → unserialize,順序顛倒會導致資料損毀
  2. URL 安全字元:Base64 可能包含 +、/、=,需搭配 urlencode() 或使用 base64url_encode() (PHP 7+)
  3. 長度限制:URL 總長度建議不超過 2000 字元,大型陣列改用 Session/資料庫暫存
  4. 安全性風險:unserialize() 可能觸發物件注入攻擊,嚴禁反序列化不可信資料

安全替代方案:JSON + Base64URL

// 編碼(安全、跨語言相容)
$encoded = rtrim(strtr(base64_encode(json_encode($data)), '+/', '-_'), '=');

// 解碼
$json = base64_decode(strtr($encoded, '-_', '+/'));
$data = json_decode($json, true); // 關聯陣列模式

現代最佳實踐建議

  • Session 儲存:大型/敏感資料存入 $_SESSION,URL 僅傳遞 Token
  • 資料庫暫存表:寫入臨時表記錄,URL 傳遞 UUID
  • JWT (JSON Web Token):自包含、可驗證、支援過期時間,適合無狀態傳遞
  • 隱藏表單欄位:POST 表單提交時使用 <input type="hidden" name="data" value="...">

適用場景對照

方案適用場景優點缺點
serialize+base64簡單內部跳轉、非敏感資料PHP 原生、支援物件不安全、長度長、編碼字元問題
JSON+base64url跨語言、前後端分離安全、標準化、無特殊字元不支援 PHP 物件、需額外處理填補
Session/DB大型資料、敏感資訊、安全關鍵安全、無長度限制、可審計需伺服器端儲存、增加複雜度
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved