如何保护公共 API 的安全?

问题描述 投票:0回答:1

我需要一些帮助来了解如何保护公共 API 的安全。

我正在构建一个云服务,它提供了一个 SaaS 应用程序,这是我的核心产品,现在已经准备就绪。但我也希望用户能够通过将我的服务纳入他们的产品来扩展他们的体验。因此,我使用 API 密钥构建了一个基本 API,用户可以在其项目中生成和使用该密钥。

我知道 API 密钥并不意味着安全,但我相信我需要提供一些东西来保护用户数据免受攻击者的侵害。 所以我遇到了 API 域过滤和权限。

由于我的端点只有几个,所以我不需要权限,但我认为允许用户指定允许哪些域名与其 API 端点交互是另一种安全级别的方法。

关键是请求的“主机”标头可能会被欺骗,那么我如何正确检查请求域是否与 API 用户指定的域之一匹配?

我的 API 密钥由哈希函数生成并进行编码,仅在创建时向用户显示密钥,并且仅将哈希值保存在数据库中。我还建议用户确保其 API 密钥的安全。

在我检查请求域的方法中,我使用“Host”标头,但它可能会被欺骗,因此感觉不像是额外的安全级别。

那么有没有什么最佳实践来保护公共 API 的安全呢? 您对我的实施有什么建议吗? 关于如何检查请求域有什么建议吗?

http web-services security api-design
1个回答
0
投票

API 密钥(或令牌)本身并不是不安全的,只要它们保持安全即可。可以通过以下方式提高安全性:

  • 使用带有许多不同字符的长键。
  • 减少密钥(或令牌)的生命周期。这增加了如果有人以某种方式有时在未经许可的情况下看到密钥,则该密钥将不再起作用的可能性。然而,这里也需要适当的平衡,因为新密钥必须交付给用户,这充满了风险。
  • 密钥/令牌黑名单,以防某些东西不再被认为是安全的。
  • 请求客户端的 IP 白名单(通常仅当客户端像其他服务器一样具有静态 IP 地址时才可实现)。

我不太明白你提到的主机头。主机名是指您的 API 端点(或您的用户的端点)。欺骗它有什么意义?发出请求并可能构成威胁的客户端本身无法通过主机名来识别,只能通过其 IP 地址和 HTTP 标头来识别。然而,后者可以随意操纵,正如您已经正确指出的那样。

© www.soinside.com 2019 - 2024. All rights reserved.