在上一篇文章中,我們探討了 API Key、OAuth 2.0 和 JWT 的基本概念及其應用。今天,我們將繼續深入,討論更多的 API 保護措施,包括 IP 白名單、速率限制(Rate Limiting)、以及 使用 HTTPS 保護 API 傳輸。此外,我們也會探討如何將這些措施組合起來,進一步加強 API 的安全性。
IP 白名單是一種簡單而有效的 API 保護方法,通過限制 API 只能被來自特定 IP 地址的請求訪問。這種方式適用於內部系統或受信任的客戶端,確保只有特定 IP 地址可以訪問 API。
[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 Key 在指定時間內的請求次數限制,可以防止惡意攻擊(如 DDoS 攻擊)或過多的請求佔用伺服器資源。
[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 錯誤。
HTTPS 通過 SSL/TLS 加密,能有效保護數據在傳輸過程中的隱私性和完整性。這對於傳輸敏感信息(如用戶名、密碼、Token 等)尤其重要。
在 .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 的最佳安全性,開發者應該根據具體場景靈活運用多種保護方法。以下是一些常見的組合策略,來進一步加強 API 的安全性:
API Key + IP 白名單:
if (!WhiteListIPs.Contains(requestIp) || apiKey != storedApiKey)
{
return Unauthorized("你的IP地址或 API Key 無效");
}
OAuth 2.0 + 速率限制:
JWT + HTTPS:
當然實際上還是有很多情境可以交叉應用,這些只是一些很簡單常用到的搭配應用,在某些大系統可能會有更嚴謹更複雜的安全性驗證系統會需要搭配
保護 API 的安全性是每個開發者必須考慮的重要問題。根據具體場景和需求,可以選擇 API Key、OAuth 2.0、JWT、IP 白名單、速率限制 和 HTTPS 等方法來提升 API 的安全性。合理搭配這些方法,可以有效降低 API 被攻擊或濫用的風險。
明智的做法是根據具體需求靈活組合這些措施。例如,對於內部 API 可以使用 API Key 和 IP 白名單,而公開 API 則可以採用 OAuth 2.0、JWT 及速率限制等策略,並始終使用 HTTPS 保護數據傳輸。隨著 API 的演進,我們也需要隨時更新和優化這些保護措施,確保系統在各種情境下的安全性與穩定性。
明天會介紹一些在.Net Core可以用到的中除了 API Key、OAuth 2.0、JWT、IP 白名單、速率限制 和 HTTPS 這些常見的 API 保護方法外,可以用來保護API的方法。
預計後天會正式把這些保護API的方法拿幾個來實做到我們寫好的ProductAPI,並且使用Postman來做測試,這些方法是不是真的有效果。