在 Web 開發中,經常需要在頁面間透過 URL 傳遞陣列資料。由於 URL 僅支援字串,需將陣列序列化並編碼。本文詳細介紹 PHP 中使用 serialize()、base64_encode() 實現陣列 URL 傳遞的完整方案與安全考量。
陣列傳遞三步驟:
serialize($array) 將陣列轉為字串表示base64_encode() 確保 URL 安全字元unserialize(base64_decode())<?php
$information = [
'name' => '張三',
'age' => 28,
'city' => '台北',
'tags' => ['PHP', 'Laravel', 'MySQL']
];
// 正確順序:serialize → base64_encode
$encoded = base64_encode(serialize($information));
echo "<a href='2.php?info={$encoded}'>查看資訊</a>";
?>
<?php
// 正確順序:base64_decode → unserialize
$info = unserialize(base64_decode($_GET['info']));
// 使用資料
echo "姓名: {$info['name']}<br>";
echo "年齡: {$info['age']}<br>";
echo "城市: {$info['city']}<br>";
echo "標籤: " . implode(', ', $info['tags']);
?>
serialize() 產生的字串包含特殊字元(如分號、冒號、大括號),直接放入 URL 會導致解析錯誤。Base64 編碼將其轉為 URL 安全字元集(A-Z, a-z, 0-9, +, /, =)。
// 正確
$encoded = base64_encode(serialize($data));
$decoded = unserialize(base64_decode($encoded));
// 錯誤 - 會導致資料損壞
$encoded = serialize(base64_encode($data)); // 序列化了 Base64 字串而非原始資料
<?php
// 發送端:加入 HMAC 簽名
function signData($data, $secretKey) {
$serialized = serialize($data);
$encoded = base64_encode($serialized);
$signature = hash_hmac('sha256', $encoded, $secretKey);
return $encoded . '.' . $signature;
}
// 接收端:驗證簽名
function verifyAndDecode($signedData, $secretKey) {
list($encoded, $signature) = explode('.', $signedData, 2);
$expected = hash_hmac('sha256', $encoded, $secretKey);
if (!hash_equals($expected, $signature)) {
throw new Exception('資料簽名驗證失敗,可能被篡改');
}
return unserialize(base64_decode($encoded));
}
?>
<?php
function encryptData($data, $key) {
$serialized = serialize($data);
$iv = random_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($serialized, 'aes-256-cbc', $key, 0, $iv);
return base64_encode($iv . $encrypted);
}
function decryptData($encryptedData, $key) {
$data = base64_decode($encryptedData);
$ivLen = openssl_cipher_iv_length('aes-256-cbc');
$iv = substr($data, 0, $ivLen);
$encrypted = substr($data, $ivLen);
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
return unserialize($decrypted);
}
?>
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| serialize + base64 | 支援複雜陣列/物件、PHP 原生 | 長度較長、需防篡改 | 內部系統、非敏感資料 |
| json_encode + base64 | 跨語言相容、可讀性佳 | 不支援資源/物件型別 | API 介面、前後端分離 |
| http_build_query | 標準查詢字串、無需解碼 | 僅支援一維陣列、URL 較長 | 簡單表單資料傳遞 |
| Session/資料庫 | 安全、無長度限制 | 需伺服器端儲存、增加複雜度 | 敏感資料、大量資料 |
isset($_GET['info']) 檢查參數存在性unserialize() 於 try-catch,防惡意資料導致錯誤PHP URL 陣列傳遞透過 serialize() + base64_encode() 組合實現簡單有效,但必須注意操作順序、安全驗證與長度限制。現代應用中,對於複雜或敏感資料傳遞,建議採用 Session、JWT 或資料庫暫存等更安全方案。理解這項技術本質,有助於在適當場景做出正確技術選型。