如何防止 URL 被篡改引發的資安風險?


URL 通常包含用戶操作的相關資訊,例如頁面識別碼、資源請求參數等。然而,若這些資訊未經妥善處理,可能被用戶惡意篡改,導致未授權存取、資料洩露甚至系統崩潰等資安問題。本文將探討這些風險,並提供有效的防範策略,確保您的應用程式更安全可靠。

資安問題簡介

URL 篡改 是指用戶在瀏覽器地址欄中手動修改 URL,試圖訪問受限制的資源或操控應用行為的過程。這種行為可能引發以下資安問題:

  1. 未授權存取:攻擊者可能修改 URL 中的參數,跳過授權邏輯直接存取敏感頁面或資料。
  2. 資料洩露:若 URL 包含明文的敏感資訊,篡改可能導致這些資訊被盜用。
  3. 業務邏輯漏洞:某些應用程式依賴 URL 決定行為,篡改可能破壞應用的正常運作,影響業務流程。

案例分析

  • 篡改資源 ID 範例
    假設有一個購物網站,訪問某個訂單頁的 URL 如下:
https://example.com/orders/view?order_id=12345
  • 採用安全框架:利用 Middleware 加強授權檢查Laravel 提供的中介層(middleware)是實現授權邏輯的理想工具。例如:
Route::middleware(['auth', 'can:view-order'])->get('/orders/view', 'OrderController@view');
  • 使用加密或不可逆雜湊處理重要參數: 避免直接暴露敏感參數,將其加密後傳遞,例如:
$encrypted = encrypt('order_id:12345');
$url = url('/orders/view?token=' . $encrypted);

在伺服端解析和驗證:

$decrypted = decrypt($request->token);
list($key, $value) = explode(':', $decrypted);
if ($key !== 'order_id') {
    abort(403);
}
  • 避免在 URL 中傳遞敏感資訊:像密碼、金鑰或個人資料這類敏感資訊應該放在 POST 請求的主體中,而非 URL 中。
  • 使用 JWT(JSON Web Token)處理認證與授權:JWT 是一種輕量化的令牌格式,用於在伺服端與客戶端間傳遞驗證資訊。結合 JWT 可有效避免 URL 篡改引發的未授權存取。例如:
use Firebase\JWT\JWT;
$payload = ['user_id' => $user->id, 'exp' => time() + 3600];
$token = JWT::encode($payload, 'your_secret_key');

$decoded = JWT::decode($token, 'your_secret_key', ['HS256']);
if ($decoded->user_id !== auth()->id()) {
    abort(403);
}

實務建議

  1. 使用工具自動掃描漏洞
    工具如 OWASP ZAP 或 Burp Suite 可用於檢測應用程式的 URL 篡改風險。
  2. 實施日誌記錄與監控
    記錄所有失敗的請求與篡改嘗試,並通過監控系統及早發現攻擊跡象。
  3. 定期安全測試
    與專業資安公司合作,定期進行滲透測試,確保應用程式無漏洞。