News

19个API安全最佳实践,助您实现安全

API 安全性是几乎所有应用程序都需要注意的最重要方面之一。

如今,API 是将应用程序与其他应用程序集成的最佳方式。 它们为您的应用程序提供了一个网关,因此,API 需要足够安全,这样您才不会遇到不速之客。

让我们来看看一些可能对您的应用程序构成威胁的 API 漏洞。

常见的应用程序接口漏洞有哪些?

  1. 跨站脚本攻击(XSS)

XSS 攻击在网络应用程序中很常见,但如果传入的用户数据没有经过适当消毒,也可能通过应用程序接口发生。 攻击者可以在服务器上运行恶意脚本,获取敏感数据。

  1. 速率限制违规

违反 API 的速率限制功能会让攻击者有机会向您的服务器发出大量请求。 最终,服务器可能会崩溃,您的客户群可能难以与您取得联系。

  1. 不恰当的认证

如果没有使用可靠的身份验证方法正确配置应用程序接口,任何第三方都可以通过应用程序接口访问您的系统。 授权也很重要,因为它定义了在指定时间内谁可以访问哪个 API 资源。

  1. 不安全的数据传输

发送给 API 消费者的数据必须经过加密。 否则,数据就有可能被中间人攻击者泄露。 因此,建议使用 HTTPS 等安全协议传输数据。

  1. 已废弃/过时的依赖项

应用程序接口有很多外部依赖项,用于执行复杂的任务和卸载一些复杂的逻辑。 如果这些依赖项存在漏洞,那么您的 API 也会间接受到攻击。 请务必更新依赖版本。

既然知道了 API 的漏洞,我们就来看看一些保护 API 安全的最佳实践。

API Versioning应用程序接口版本化

定期监控和更新 API 的依赖关系至关重要,因为这些依赖关系可能包含重大漏洞。 您可以通过根据语义版本发布 API 的补丁版本来通知 API 用户。

保持 API 的更新是防止其被攻击者利用的最起码措施。

Authentication认证

有很多方法可以对 API 用户进行身份验证。 最简单的方法是使用用户名/密码,但这太基本了,只能依靠密码的强度。

另一种方法是使用 API 密钥访问 API。 您可以为每个 API 用户提供他们可以使用的唯一密钥。

JWT 身份验证是一种将用户凭据转换为数字签名令牌并发送给用户的技术。 然后,用户在每次向服务器发送请求时都会发回相同的令牌,供服务器验证。 JWT 也有过期时间。

最有效的解决方案是 OAuth。 它允许第三方使用已有的登录凭证访问 API。 例如,如果您已经登录了 Google,应用程序就可以使用这些凭据登录您的账户,而无需密码。 你的 Google 账户就成了密码。

Authorization 授权

授权与验证是两码事。 当你授权用户时,他们已经通过了使用 API 的身份验证,只是他们可以访问哪些 API 资源而已。

例如,大学教授可以访问一批学生中的所有学生,但一个学生只能访问他们的数据。 在这种情况下,学生和教授都通过了同一系统的身份验证,但只有权执行某些操作。

确保应用程序接口授权运行良好,可以防止未经授权访问资源。

Data Redaction数据再编辑

数据编辑是有选择地向用户披露信息并保护敏感信息的过程。 适当的授权可以更好地进行数据编辑。 GDPR 等数据隐私法规也以数据编辑为基础。 任何不受欢迎的第三方都应无法窥探个人或敏感数据。

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

Encryption加密

这已成为当今世界最重要的安全检查。 如果要处理任何类型的敏感信息,加密是必须的。 最简单的加密方式是使用 HTTPS 协议,该协议使用 TLS(传输层安全)握手和 SSL(安全套接字层)。

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

Error Handling错误处理

有关应用程序基础架构的信息可能会通过详细的错误信息泄露给攻击者。 为避免这种情况,应保持错误信息的通用性并实施自定义错误处理。 确保错误详细信息中不会记录敏感的系统信息。

Input Validation and Data Sanitization输入验证和数据净化

在处理应用程序接口时,输入验证是非常重要的,因为在用户发送输入之前,你是不知道输入内容的。

净化是从有效负载中删除任何不需要的可执行代码的过程。 攻击者可以输入 Javascript 脚本,如果在将其传递到 HTML 之前不对其进行消毒,它就会作为脚本执行并获取数据。

不正确的 sanitization 会导致跨站脚本 (XSS) 攻击。

Intrusion Detection Systems入侵检测系统

入侵检测系统又称 IDS,有助于监控和检测进入 API 的网络流量。 如果它发现流量中有任何异常行为,就会记录下来并向有关部门发出警报。

一般来说,有两类系统:基于网络的系统和基于主机的系统。 在基于网络的系统中,系统分布在不同的检查点,以监控多个点的流量。 在基于主机的系统中,系统部署在单个主机上。

此类系统是一种很好的方法,可以在谁试图访问您的网络之前确定他们是否会妨碍您的数据。

IP Whitelisting IP白名单

IP 白名单是一种只允许选定 IP 地址访问 API 和网络的方法。 如果您有一个公共 API,这种技术可能不起作用,因为要列出每个 IP 太复杂了。

如果您知道只有部分系统应用程序会访问您的应用程序接口,那么这将是非常有益的。

JSON Web Tokens JSON Web令牌

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

JWT 可分为三个部分:头部、有效载荷和签名。 有效载荷部分包含用户凭据,头部可包含所用算法等信息。 在每次后续请求中,服务器和客户端都会对签名部分进行数字签名。

JWT 通常有一个过期日期,过期后服务器会生成一个新的令牌,然后发送给用户。

Logging and Monitoring记录和监控

监控应用程序接口的流量有助于事先检测和识别不受欢迎的访问者。 您可以监控每一个请求,但要确保日志不包含任何敏感信息。

Rate Limiting速率限制

如果应用程序接口没有实施速率限制,就很容易因意外涌入的网络流量而遭受 DDoS 攻击。 攻击者可以在短时间内向系统发出大量请求,最终导致服务器崩溃。

通过限制 API 流量,节流和限速 API 可避免拒绝服务攻击。

Secure Dependencies安全依赖

漏洞不仅出现在您的应用程序接口代码中,它们也可能是您在应用程序接口中使用的任何第三方依赖项的一部分。 因此,定期监控和扫描您的依赖项并检测其中可能存在的任何漏洞非常重要。

如果可以用修补漏洞的补丁版本更新依赖项,就可以执行计划任务,定期扫描和更新依赖项。 此外,还要选择更安全并提供频繁安全更新的依赖项。

Security Headers安全标头

安全标头应与 API 响应一起返回,以便向浏览器说明 API 的安全性以及应如何操作。 为提高安全性,您可以发送以下重要标头:

  • 缓存控制: 将其设置为无存储,以避免在浏览器中存储敏感信息。
  • 内容安全策略: 将其设置为 frame-ancestors “none”,可避免在 iframe 中设置 API 响应。
  • 内容类型: 这个标头很重要,因为如果没有它,浏览器就会试图猜测 API 响应的类型,从而导致嗅探攻击。 对于 JSON 响应,可以将其设置为 application/json。
  • X-Content-Type-Options: 将其设置为 nosniff,以指示浏览器不要猜测响应的 MIME 类型,而只在 Content-Type 标头中查找。

Security Standards and Frameworks安全标准和框架

借助预定义的安全标准和框架设计您的应用程序接口,确保您的应用程序接口符合最新的安全考虑因素。

Token Expiry

如果使用的是不记名令牌,那么令牌的过期时间应该很短,因为它需要重新认证用户,这是一件好事。 在 JWT 中,通常有两种令牌:访问令牌和刷新令牌。 刷新令牌的有效期较长,而访问令牌的有效期较短。 无论如何,你的令牌都应该有到期时间。

Web Application Firewall网络应用防火墙

WAF 又称网络应用程序防火墙,是一个可以监控、过滤和阻止任何恶意网络流量的网关。 它通常是防止通过 HTTP 协议进行恶意攻击的最佳方法。

Using API Gateways使用应用程序接口网关

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

Zero-Trust

零信任策略背后的理念是不信任任何集中式来源。

从根本上说,任何人都不可信,即使是开发应用程序接口的开发人员。 应该监控和分析每一个网关,以防止安全漏洞。

在这种情况下,自动化就派上用场了。 您可以使用自动化工具定期监控和阻止异常或可疑活动。

最后

你可以尽最大努力来确保你的API安全。但软件中总会有一些漏洞可以被利用。这些漏洞会导致零日漏洞的出现。因此,为了保护你的API,你至少应该确保它们与最新的安全标准保持更新。

原文链接:19 API Security Best Practices To Implement And Stay Safe

Leave a Reply

Your email address will not be published. Required fields are marked *