在前端应用程序中公开 API 端点

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

我正在使用 React 构建前端应用程序,我想知道在 GitHub 上公开 API 端点 URL(例如:

https://myapi.com/v1/getitems
)是否有风险,假设端点具有多种未公开的安全措施,例如
CORS
JWT Token Bearer Authentication
。我认为不会,因为如果有人要获取端点并发送请求,他们将需要一个令牌并被 CORS 允许这样做。

这样做有安全风险吗?

reactjs rest github jwt
2个回答
2
投票

是的。不要在 github 上以普通视图添加 api 的基本 url。即使您可能有

CORS
Authorization
,但这并不能阻止恶意行为者继续向您的后端发送垃圾邮件。

您要做的就是在根文件夹中创建一个 .env 文件。您可以使用像

@beam-australia/react-env
这样的库,还有其他库。

您在 .env 文件中添加对您的环境很重要并且通常是机密的值,并且您希望它们在代码中不可见。你这样做:

API_URL="https://myapi.com/v1"

然后您可以使用

env("API-URL")
在代码中访问此变量(在
@beam-australia/react-env
情况下,但其他库的工作方式相同)。请记住,您需要在
.env
中添加
.gitignore
,这样 .env 文件就不会推送到 github。

关于请求,您可以这样提出:

fetch(`${env("API_URL")}/getitems`)

这样,您的代码将被剥离 API 的基本 url,如果有人看到您的代码,它只会看到端点,而不是完整的 url。


1
投票

发布 API 代码本身就有风险。有人可以找到其中的漏洞并立即破解它。如果将 API 地址添加到代码中,则有助于此类攻击。他们可以通过一些调查获得地址;开源情报和社会工程也是如此,但最好减少攻击面。

至于秘密,它们绝不能靠近代码,因为您或其他开发人员可能会意外发布它。对于很多开发人员来说,这种情况已经发生过太多次了,所以最好认真对待这个问题。如果您想对地址保密,则必须从代码中提取它并将其放入生产环境的配置中,该配置是从与代码完全不同的位置导入的。像 Alex 建议的那样使用环境变量是一个好主意。现在使用 docker 很常见,它有一种管理秘密的方法,所以你不需要重新发明轮子:https://docs.docker.com/engine/swarm/secrets/ 配置的另一个方面属于实际实例。用 OOP 术语来说,您想要描述对象在其类或全局变量中的注入属性,这是一种反模式。

对于客户端 REST 客户端(例如在浏览器中运行的 javascript 应用程序或 Android/iOS 应用程序),您不得与 REST 客户端一起发布您的秘密,否则它不再是秘密。在这种情况下,您需要 REST 客户端的服务器端部分,例如使用密钥对 JWT 进行签名和加密。您可以决定 REST 客户端的服务器端部分是否将 HTTP 请求发送到 REST API,在这种情况下,您可以隐藏 REST API 的 URI,或者它只管理 JWT,而 REST 客户端的客户端部分发送它。如果 REST 客户端的服务器端部分将 HTTP 请求发送到 REST API,那么您甚至可以在 REST 客户端的客户端和服务器端部分之间使用带有会话 cookie 的传统会话,但不能在服务器之间使用它们REST 客户端和 REST API 的侧面部分,其中通信必须是无状态的。如果在这种情况下没有多个不同的 REST 客户端,那么拥有单独的 REST API 没有多大意义。 JS 和 JSless 浏览器的浏览器客户端、Android 和 iOS 客户端、在服务器上运行的全自动客户端等。因此,不要将 REST 客户端 - REST API 关系与浏览器 - HTTP 服务器关系混淆,因为它们不一定相同。大多数 REST 客户端运行在服务器上,而不是在浏览器中。

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