如何保护仅服务于我的前端的自己的后端 API?

How to secure own backend API which serves only my frontend?

我正在设置一个带有前端和后端的 Web 应用程序,它通过 RESTful 方法与前端进行通信。我如何确保后端端点只能由我自己的前端访问,而不是由其他任何人访问?我找不到太多这方面的信息。

How do I make sure that the backend endpoints are only accessed by my own frontend, and not anyone else?

让我在这里告诉你一个残酷的事实......对于网络应用程序来说是不可能的,因为 自然网络是如何设计的。

让我们尝试通过理解 WHOWHAT 之间的区别正在访问您的 API 服务器,以及为什么是私有的 API 不存在。

谁和什么正在访问 API 服务器

WHO 是 Web 应用程序的用户,您可以通过多种方式对其进行身份验证、授权和识别,例如使用 OAUTH 流 and/or OpenID。

OAUTH

Generally, OAuth provides to clients a "secure delegated access" to server resources on behalf of a resource owner. It specifies a process for resource owners to authorize third-party access to their server resources without sharing their credentials. Designed specifically to work with Hypertext Transfer Protocol (HTTP), OAuth essentially allows access tokens to be issued to third-party clients by an authorization server, with the approval of the resource owner. The third party then uses the access token to access the protected resources hosted by the resource server.

OpenID

OpenID Connect 1.0 is a simple identity layer on top of the OAuth 2.0 protocol. It allows Clients to verify the identity of the End-User based on the authentication performed by an Authorization Server, as well as to obtain basic profile information about the End-User in an interoperable and REST-like manner.

现在您需要一种方法来识别什么 正在调用您的API 服务器,这里的事情变得比大多数开发人员想象的更棘手。 WHAT 是向 API 服务器发出请求的东西,它真的是您的正版网络应用程序还是机器人、自动脚本或攻击者手动在您的 API 服务器有像 Postman 这样的工具?

确定什么 开发人员倾向于求助于 API 密钥,通常他们在 header 中发送,在 cookie 中或隐藏在他们的网络应用程序的 javascript 代码,有些人加倍努力并在网络应用程序中的 run-time 计算它,因此成为一个动态秘密,与前一种方法相反,前一种方法是嵌入在代码或在 header.

私人 APIs

无论 API 是否没有 public 可访问的文档,或者是否受到任何类型的秘密或身份验证机制的保护,一旦可以访问 来自互联网的内容不是私人的 any-more,因此任何人都可以访问 知道它的位置并枚举每个端点很容易使用网络 开发工具中的选项卡。

可能的解决方案

任何在客户端运行并需要一些秘密才能访问 API 的东西 可以以不同的方式被滥用,你可以了解更多 this series 个 关于移动 API 安全技术的文章。虽然这篇文章是在 在移动应用程序的上下文中,它们仍然与网络应用程序共享通用技术。 他们将教您如何使用 API 密钥、用户访问令牌、HMAC 和 TLS Pinning 用于保护 API 以及如何绕过它们。

您的 Javascript 代码可以通过混淆来使其难以理解,这将使逆向工程变得困难,但请记住并非不可能,因此不要依赖它来隐藏敏感数据,但只是作为另一层让人们更难理解正在发生的事情。

您可能还想查看 reCaptcha V3 和 Google 以区分真实用户 来自自动化脚本,无需用户交互。您需要将它添加到网络应用程序的每个页面。

reCaptcha V3

reCAPTCHA is a free service that protects your website from spam and abuse. reCAPTCHA uses an advanced risk analysis engine and adaptive challenges to keep automated software from engaging in abusive activities on your site. It does this while letting your valid users pass through with ease.

另一种更复杂的方法是使用在后端采用机器学习和人工智能的用户行为分析 (UBA) 工具来防止 API 滥用,但它们无法 100% 阻止它。

要解决 WHAT 正在访问您的 API 服务器的问题,您需要使用移动 [=74] 系列文章中提到的一个或所有解决方案=] 安全技术、reCaptcha V3 和 UBA 解决方案,并承认它们只能使未经授权访问您的 API 服务器更难绕过,但并非不可能。

摘要

因此,您可能很难找到并访问您的 API,但要真正将其锁定到您的网络应用程序,您却做不到。

  1. 查看 CORS。并确保您的服务器只允许访问特定来源。

  2. 在后端 - 检查请求中是否存在 X-Requested-With header 并设置为 XMLHttpRequest。如果没有适当的 CORS 握手,这个 header 将 不存在

也就是说,这只会保护您的 API 不被 其他 front-end 应用程序 使用或直接从浏览器地址栏访问- 因为浏览器尊重 CORS。人们仍然可以伪造请求 programmatically/CLI 并将 headers 设置为他们想要的任何值。

所以这实际上并不是“保护”只是一种防止滥用和盗链的方法