base64_encode、urlencode、sha1 是 PHP 開發中最高頻的三種字串處理函數,但常被混淆使用。本文釐清三者定位、編碼原理、適用場景與組合技巧,避免「加密」與「編碼」概念不清導致的安全漏洞。
| 函數 | 類別 | 可逆性 | 主要用途 | 輸出特徵 |
|---|---|---|---|---|
base64_encode() | 編碼 | 可逆 | 二進位資料安全傳輸(JSON、Cookie、Header、資料庫 Blob 儲存) | A-Z a-z 0-9 + / =,長度約原始 4/3 |
urlencode() | 編碼 | 可逆 | URL 查詢字串參數編碼、表單 POST application/x-www-form-urlencoded | %XX 格式,空格→+ |
sha1() | 雜湊 | 不可逆 | 完整性驗證、簽名、密碼雜湊(建議改用 password_hash) | 40 字元十六進制 |
<?php
$original = '中文測試😀'; // 含 Unicode
$encoded = base64_encode($original); // 5b6u5L+h5rWL6K+V77yB
$decoded = base64_decode($encoded); // 還原完美
// 實戰:API Token 組合
$payload = json_encode(['uid' => 123, 'exp' => time()+3600]);
$token = base64_encode($payload); // 可放入 Header/URL 無特殊字元風險
?>
<?php
$params = [
'keyword' => 'PHP & MySQL',
'callback' => 'https://example.com/notify?type=order',
];
$query = http_build_query($params); // 內部自動 urlencode
// keyword=PHP+%26+MySQL&callback=https%3A%2F%2Fexample.com%2Fnotify%3Ftype%3Dorder
// 手動組裝時
$url = 'https://api.example.com/search?' . http_build_query($params);
?>
<?php
$data = 'order_id=1001&amount=99.9&secret_key=MY_SECRET';
$sign = sha1($data); // 249ba36000029bbe97499c03db5a9001f6b734ec
// 驗證端重新計算比對,防範竄改
?>
<?php
$raw = 'user=admin&role=super';
// 1. SHA1 產生簽名
$sign = sha1($raw . $secret_key);
// 2. 組合 payload
$payload = $raw . '&sign=' . $sign;
// 3. Base64 編碼整體(含特殊字元)
$token = base64_encode($payload);
// dXNlcj1hZG1pbiZyb2xlPXN1cGVyJnNpZ249MmQ5YmEzNjAwMDAyOWJiZTk3NDk5YzAzZGI1YTkwMDFmNmI3MzRlYw==
// 4. URL Encode 放入 Query String(若 token 含 + / =)
$url = 'https://api.example.com/auto_login?token=' . urlencode($token);
?>
openssl_encrypt() (AES) 或 sodium_crypto_secretbox()。password_hash($pwd, PASSWORD_DEFAULT)(BCrypt/Argon2),驗證用 password_verify()。& = 截斷參數。統一使用 http_build_query()。+ / =,在 URL 中會被誤解析。傳輸前務必 urlencode(base64_encode($data))。password_hash() + password_verify()。分清「編碼、雜湊、加密」三大類別,才能在正確場景選用正確工具,寫出安全可維護的程式碼。