实施并保持安全的 19 个 API 安全最佳实践

API 安全性是任何应用程序都必须认真对待的核心问题之一。

如今,API 已成为将应用程序与外部服务集成的主要方式。它们是您应用程序的入口点,因此必须确保 API 具有足够的安全性,以避免不必要的访问。

以下是一些可能威胁应用程序安全的常见 API 漏洞:

常见的 API 漏洞

#1. 跨站脚本攻击 (XSS)

XSS 攻击在 Web 应用程序中很常见,如果用户输入的数据未经过适当的清理,也可能发生在 API 中。攻击者可能会在服务器上执行恶意脚本,进而获取敏感数据。

#2. 速率限制违规

如果 API 的速率限制功能被滥用,攻击者可能会通过发送大量请求来攻击您的服务器。最终,服务器可能会崩溃,导致用户无法访问您的服务。

#3. 身份验证不当

如果 API 没有采用可靠的身份验证机制进行配置,任何第三方都可能未经授权地访问您的系统。授权也是关键,它决定了谁可以在指定时间内访问哪些 API 资源。

#4. 数据传输不安全

发送给 API 使用者的数据必须在传输过程中进行加密。否则,攻击者可能会利用中间人攻击来窃取数据。因此,始终建议使用 HTTPS 等安全协议进行数据传输。

#5. 已弃用或过时的依赖项

API 通常依赖许多外部库来执行复杂的操作。如果这些依赖项存在漏洞,那么您的 API 也可能变得脆弱。务必确保及时更新这些依赖项的版本。

现在您已经了解了 API 的漏洞,接下来我们看看一些保护 API 的最佳实践。

拓展阅读:为开发人员测试 API 的最佳 Postman 替代方案

API 安全 – 最佳实践

API 版本控制

定期监控和更新 API 及其使用的依赖项至关重要,因为这些依赖项可能存在安全漏洞。可以使用 语义版本控制,根据 API 发布补丁的方式来通知 API 用户。

为了防止攻击者利用您的 API,最基本的一点就是确保 API 处于最新状态。

身份验证

您可以通过多种方式对 API 用户进行身份验证。最简单的方法是使用用户名/密码验证,但这种方法相对基础,安全性依赖于密码的强度。

另一种方法是使用 API 密钥访问 API。您可以为每个 API 用户分配一个唯一的密钥。

JWT 身份验证是一种将用户凭据转换为数字签名令牌并发送给用户的技术。然后,用户在每个请求中将相同的令牌发回服务器进行验证。JWT 通常具有过期时间。

最有效的解决方案是 OAuth。它允许第三方应用程序使用现有的登录凭据来访问 API。例如,如果您已经登录 Google,应用程序可以使用这些凭据来登录您的帐户,而无需您提供密码。您的 Google 帐户本身就充当了密码。

授权

授权与身份验证有所不同。授权是指在用户通过身份验证后,确定他们可以访问哪些 API 资源。

例如,大学教授可能可以访问班级中所有学生的信息,而单个学生只能访问自己的数据。在这种情况下,学生和教授通过同一系统进行身份验证,但仅被授权执行特定的操作。

确保 API 授权正常工作,可以防止对资源的未经授权的访问。

数据编辑

数据编辑是指选择性地向用户披露信息并保护敏感数据的过程。适当的授权机制是实现数据编辑的基础。数据隐私法规(如 GDPR)也强调了数据编辑的重要性。任何未经授权的第三方都不能访问个人或敏感数据。

您可以通过实施中间件或网关管理器来实现数据编辑。

加密

加密是现代安全体系中至关重要的一环。如果您要处理任何类型的敏感信息,加密是必须的。最基本的加密方法是使用 HTTPS 协议,该协议使用 TLS(传输层安全)握手和 SSL(安全套接字层)。

端到端加密是另一种严格保护传输中数据安全的方式。存储在数据库中的数据也应该加密,以防止攻击者在入侵数据库后访问到数据。

错误处理

详细的错误信息可能会泄露应用程序基础设施的敏感信息给攻击者。为了避免这种情况,请保持错误信息通用,并实现自定义的错误处理。确保错误详细信息中没有记录任何敏感的系统信息。

输入验证和数据清理

处理 API 时,输入验证非常重要,因为您在用户发送输入之前无法预测输入内容。

数据清理是指从请求数据中删除不需要的可执行代码的过程。攻击者可能会输入 JavaScript 脚本,如果不对其进行清理就传递到 HTML 中,它将被作为脚本执行并获取数据。

不当的数据清理可能会导致跨站点脚本 (XSS) 攻击。

入侵检测系统

入侵检测系统 (IDS) 用于监控和检测传入 API 的网络流量。如果检测到任何异常活动,系统会记录并向相关人员发出警报。

通常有两种类型的系统:基于网络的系统和基于主机的系统。基于网络的系统将检测点分布在不同位置,监控多处流量。而基于主机的系统则部署在单个主机上。

这种系统可以有效地在数据被泄露之前,确定谁正在尝试访问您的网络。

IP 白名单

IP 白名单是一种只允许指定的 IP 地址访问您的 API 和网络的方法。如果您的 API 是公开的,这种技术可能不太适用,因为列出每个 IP 地址过于复杂。

如果您的系统中只有特定的应用程序会访问您的 API,那么这种方法将非常有用。

JSON Web 令牌

JWT 常用于通过向用户发送基于其凭据创建的数字签名令牌来验证用户身份。这种方法之所以有效,是因为它隐藏了用户的实际凭据,并且您无需在数据库或用户端存储凭据。

JWT 由三个部分组成:标头、负载和签名。有效负载部分包含用户的凭据,标头可以包含所使用的算法等信息。签名部分由服务器和客户端对后续请求进行数字签名。

JWT 通常具有过期时间,之后服务器会生成新的令牌并发送给用户。

日志记录和监控

监控 API 流量有助于提前检测和识别未经授权的访问。您可以监控每个请求,但请确保日志中不包含任何敏感信息。

速率限制

如果 API 没有实施速率限制,它很容易受到 DDoS 攻击。攻击者可以在短时间内向系统发送大量请求,最终导致服务器崩溃。

通过限制 API 流量,节流和速率限制可以有效地防止拒绝服务攻击。

安全依赖

漏洞不仅可能存在于您的 API 代码中,还可能存在于您在 API 中使用的任何第三方依赖项中。因此,定期监视和扫描依赖项,检测其中可能存在的漏洞至关重要。

如果有可以修复漏洞的补丁版本,您可以实施计划作业来定期扫描和更新依赖项。此外,选择更安全且提供频繁安全更新的依赖项。

安全标头应与 API 响应一起返回,以告知浏览器有关 API 安全性的信息及其应如何操作。 以下是一些可以提高安全性的重要标头:

  • Cache-Control: 设置为 no-store, 以避免在浏览器中存储敏感信息。
  • Content-Security-Policy: 设置为 frame-ancestors 'none' 可以避免在 iframe 中构建 API 响应。
  • Content-Type: 此标头非常重要,如果没有它,浏览器可能会尝试猜测 API 响应的类型,导致嗅探攻击。对于 JSON 响应,可以设置为 application/json
  • X-Content-Type-Options: 设置为 nosniff, 以指示浏览器不要猜测响应的 MIME 类型,而仅在 Content-Type 标头中查找。

安全标准和框架

在设计 API 时,应参考预定义的安全标准和框架,以确保您的 API 符合最新的安全要求。

令牌过期

如果使用不记名令牌,令牌的过期时间应该很短,因为这会强制用户重新进行身份验证,这是一个很好的安全实践。在 JWT 中,通常有两种令牌:访问令牌和刷新令牌。刷新令牌的有效期较长,而访问令牌的有效期较短。无论如何,您的令牌应该有一个过期时间。

Web 应用程序防火墙

WAF(Web 应用程序防火墙)是一个监视、过滤和阻止恶意网络流量的网关。 它通常是防止通过 HTTP 协议进行的恶意攻击的最佳方法。

使用 API 网关

如果您希望轻松设置 API 安全性,并管理 API 路由及其访问,可以选择 API 网关。它们还提供了监控、日志记录和分析工具,可以用来监控您的 API。

零信任

零信任策略背后的理念是不信任任何单一的中心来源。安全性应分层部署,并在多个检查点实施。

基本上,任何人都不可信任,即使是 API 开发人员。应监控和分析每个网关,以防止安全漏洞。

在这种情况下,自动化至关重要。您可以使用自动化工具定期监控并阻止异常或可疑活动。

总结

为了确保 API 的安全,我们能做的始终是有限的。软件中总会存在可以被利用的漏洞。这些漏洞可能会导致零日攻击。因此,为了保护您的 API,最基本的一点就是使它们保持最新的安全标准。

了解更多关于 最佳的动态应用程序安全测试工具