當資料庫中的自動遞增主鍵在 URI 或 API 呼叫中對使用者可見時,我需要一種簡單的方法來模糊處理它們。使用者不應該能夠在 URL 中遞增 ID,並查看資料庫表格中的下一個資料記錄。
我的解決方案(使用 Tom 修改過的 base64 函式)
function base64url_encode($plainText) {
$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/=', '-_,');
return $base64url;
}
function base64url_decode($plainText) {
$base64url = strtr($plainText, '-_,', '+/=');
$base64 = base64_decode($base64url);
return $base64;
}
function encryptId($int, $class='') {
return base64url_encode($int.'-'.substr(sha1($class.$int.encryptionKey), 0, 6));
}
function decryptId($string, $class='') {
$parts = explode('-', base64url_decode($string));
if (count($parts) != 2) {
return 0;
}
$int = $parts[0];
return substr(sha1($class.$int.encryptionKey), 0, 6) === $parts[1]
? (int)$int
: 0;
}
- 可選的第二個參數是類別名稱,因此不同表格的兩個相同 ID 不會產生兩個相同的模糊 ID。
- encryptionKey 是用於加密的全域金鑰。
- decryptId() 檢查 base64 編碼字串的第二部分是否正確。