iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0

在上一篇文章中,我們探討了 API Key、OAuth 2.0 和 JWT 的基本概念及其應用。今天,我們將繼續深入,討論更多的 API 保護措施,包括 IP 白名單速率限制(Rate Limiting)、以及 使用 HTTPS 保護 API 傳輸。此外,我們也會探討如何將這些措施組合起來,進一步加強 API 的安全性。


4. IP 白名單

IP 白名單是一種簡單而有效的 API 保護方法,通過限制 API 只能被來自特定 IP 地址的請求訪問。這種方式適用於內部系統或受信任的客戶端,確保只有特定 IP 地址可以訪問 API。

工作原理

  1. 伺服器維護一個允許訪問 API 的 IP 地址列表。
  2. 當 API 收到請求時,伺服器會檢查發送請求的 IP 是否在白名單中。
  3. 如果 IP 地址不在白名單中,伺服器會拒絕該請求。

範例程式碼(.NET Core 中的 IP 白名單實現):

[ApiController]
[Route("api/[controller]")]
public class WhiteListController : ControllerBase
{
    private static readonly List<string> WhiteListIPs = new List<string> { "192.168.1.1", "203.0.113.5" };

    [HttpGet]
    public IActionResult GetProtectedResource()
    {
        var requestIp = HttpContext.Connection.RemoteIpAddress?.ToString();

        if (!WhiteListIPs.Contains(requestIp))
        {
            return Unauthorized("你的IP地址不在白名單中");
        }

        return Ok("成功訪問受保護的資源!");
    }
}

優點

  • 簡單直接,適合內部 API。
  • 可以有效防止未授權的外部 IP 訪問 API。

缺點

  • 只適用於固定 IP 或可信任的客戶端,不適用於大規模的公開 API。

5. 速率限制(Rate Limiting)

速率限制是防止 API 遭受過多請求攻擊的有效手段。通過設置每個 IP 地址或 API Key 在指定時間內的請求次數限制,可以防止惡意攻擊(如 DDoS 攻擊)或過多的請求佔用伺服器資源。

工作原理

  1. 伺服器為每個 API 使用者設置一個請求限制,比如每分鐘最多發送 100 次請求。
  2. 當使用者超過這個限制後,伺服器會返回 HTTP 429 錯誤,表示請求過多。
  3. 使用者需要等待一段時間後才能再次發送請求。

範例程式碼(速率限制實現):

[ApiController]
[Route("api/[controller]")]
public class RateLimitedController : ControllerBase
{
    // 紀錄每個 IP 的請求次數
    private static Dictionary<string, int> requestCounts = new Dictionary<string, int>();
    // 設置速率限制為每分鐘最多 10 次請求
    private const int MAX_REQUESTS_PER_MINUTE = 10;
    private static DateTime lastRequestTime = DateTime.Now;

    [HttpGet]
    public IActionResult GetRateLimitedResource()
    {
        var clientIp = HttpContext.Connection.RemoteIpAddress?.ToString();

        // 每分鐘重置請求次數
        if ((DateTime.Now - lastRequestTime).TotalMinutes >= 1)
        {
            requestCounts.Clear();
            lastRequestTime = DateTime.Now;
        }

        // 檢查當前 IP 是否已經超過請求限制
        if (!requestCounts.ContainsKey(clientIp))
        {
            requestCounts[clientIp] = 1;
        }
        else
        {
            requestCounts[clientIp]++;
        }

        if (requestCounts[clientIp] > MAX_REQUESTS_PER_MINUTE)
        {
            return StatusCode(429, "請求次數過多,請稍後再試");
        }

        return Ok("成功訪問受速率限制保護的資源!");
    }
}

這個範例展示了一個簡單的速率限制實現,使用 Dictionary 來追蹤每個 IP 地址的請求次數,並限制每分鐘最多 10 次請求。當超過限制時,伺服器返回 HTTP 429 錯誤。

優點

  • 能夠防止惡意攻擊或濫用 API。
  • 提升伺服器的穩定性和可用性。

缺點

  • 需要正確配置和管理速率限制,否則可能影響正常的使用者。

6. 使用 HTTPS 保護 API 傳輸

HTTPS 通過 SSL/TLS 加密,能有效保護數據在傳輸過程中的隱私性和完整性。這對於傳輸敏感信息(如用戶名、密碼、Token 等)尤其重要。

工作原理

  1. HTTPS 為傳輸層提供加密,所有請求和回應在傳輸中加密,確保數據的隱私性和完整性。
  2. 伺服器和客戶端通過 SSL/TLS 握手協議進行驗證,以確保雙方可信。

範例程式碼(強制使用 HTTPS):

在 .NET Core 中,可以使用以下方式來強制所有 API 請求使用 HTTPS:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
        options.HttpsPort = 443; // 預設的 HTTPS 端口
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (!env.IsDevelopment())
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

優點

  • 提高了 API 的傳輸安全性,防止中間人攻擊。
  • 保證數據的完整性和隱私性。

缺點

  • SSL/TLS 可能會帶來一些性能開銷。
  • 需要正確配置和管理 SSL 憑證。

如何組合使用這些保護措施

要實現 API 的最佳安全性,開發者應該根據具體場景靈活運用多種保護方法。以下是一些常見的組合策略,來進一步加強 API 的安全性:

  1. API Key + IP 白名單

    • 適用場景:內部系統或受信任的客戶端。
    • 搭配方式:使用 API Key 來驗證每個客戶端的身份,同時利用 IP 白名單限制來自特定 IP 地址的訪問,進一步限制可能的攻擊範圍。
    if (!WhiteListIPs.Contains(requestIp) || apiKey != storedApiKey)
    {
        return Unauthorized("你的IP地址或 API Key 無效");
    }
    
    
  2. OAuth 2.0 + 速率限制

    • 適用場景:第三方應用集成,特別是需要嚴格控制 API 使用量的情況。
    • 搭配方式:使用 OAuth 2.0 進行授權,並對每個授權的用戶或應用進行速率限制,防止過度使用或惡意攻擊。
  3. JWT + HTTPS

    • 適用場景:用於身份驗證的 API,特別是需要傳輸敏感信息的情況。
    • 搭配方式:JWT 驗證用戶身份,確保請求的合法性,並使用 HTTPS 保護傳輸中的數據,防止中間人攻擊或數據篡改。

    當然實際上還是有很多情境可以交叉應用,這些只是一些很簡單常用到的搭配應用,在某些大系統可能會有更嚴謹更複雜的安全性驗證系統會需要搭配


每日小結

保護 API 的安全性是每個開發者必須考慮的重要問題。根據具體場景和需求,可以選擇 API KeyOAuth 2.0JWTIP 白名單速率限制HTTPS 等方法來提升 API 的安全性。合理搭配這些方法,可以有效降低 API 被攻擊或濫用的風險。

明智的做法是根據具體需求靈活組合這些措施。例如,對於內部 API 可以使用 API Key 和 IP 白名單,而公開 API 則可以採用 OAuth 2.0、JWT 及速率限制等策略,並始終使用 HTTPS 保護數據傳輸。隨著 API 的演進,我們也需要隨時更新和優化這些保護措施,確保系統在各種情境下的安全性與穩定性。

明天會介紹一些在.Net Core可以用到的中除了 API KeyOAuth 2.0JWTIP 白名單速率限制HTTPS 這些常見的 API 保護方法外,可以用來保護API的方法。

預計後天會正式把這些保護API的方法拿幾個來實做到我們寫好的ProductAPI,並且使用Postman來做測試,這些方法是不是真的有效果。


上一篇
Day 17 保護你的API (上)
下一篇
Day 19: 保護你的 API(下) .NET Core 中的進階 API 安全設置
系列文
使用 C# 從零開始玩轉 Web API,從基礎到微服務與雲端部署的全面探索22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言