首页 > 解决方案 > 如何使 Node API 只能由 Web 应用访问?

问题描述

我正在开发一个带有 React 的 Web 应用程序和一个带有 Node.js / Express 的 GraphQL API。我想让 API 更安全,以便不是来自浏览器上的 Web 应用程序的 API 请求更难获取数据。我知道如何与注册用户一起做。但是如何让非注册用户仍然可以访问应用程序所需的一些基本数据呢?

是否可以在网络应用程序中放置某种密钥 - 因此无法通过在浏览器中嗅探网络开发工具并在 Postman 中复制来为其他人复制 API 调用?SSL/TLS 是否也保护该浏览器工具中的请求?还是像“标准”用户一样为非注册访问者使用?

它是一个带有 next.js 的服务器端 Web 应用程序

我知道没有 100% 安全的 api,但也许它可能使未经授权的访问更难。

编辑:我不确定这是否是关于 CSRF 的问题,因为它不是关于访问用户数据或通过恶意网站更改数据等。而是关于其他人试图使用网站数据(对 API 的所有 GET 请求)并且可以轻松在我的 api 之上构建自己的网络应用程序。所以没有人可以通过简单的 Postman 请求轻松查询我的 api。

标签: node.jsreactjssecurityexpressgraphql

解决方案


快速的回答是不,你不能。

如果您试图阻止可以描述为合法用户的形式访问您的 api,那么您将无法真正做到。他们总是可以伪造相同的逻辑并在滥用 api 之前先访问您的网页。如果这是您试图阻止您最好的选择是向 api 添加速率限制以防止单个用户向您的 api 发出过多请求(我是ralphi的作者,并且 express-rate-limit非常受欢迎) .

但是,如果您实际上是在尝试防止其他网站泄露您并向其用户提供内容,则实际上更容易解决。

大多数浏览器都会发送带有请求的Referrer 标头,您可以检查此标头并查看请求实际上来自您自己站点上的用户(这种技术称为 Leech Protection)。

浸出站点可以尝试将请求代理到您的 api,但由于它们都来自同一个 IP,因此它们将达到您的速率限制,并且在被阻止之前他只能为少数用户提供服务。

Leecher 站点可以做的一件事是尝试缓存您的 api,这样他就不必发出这么多请求。如果这是一种可能的情况,您将回到原点,一旦您发现这种滥用行为,您可能需要手动阻止他的 IP。我还会检查这是否合法,因为他可能违反了法律。

另一个类似于 Referrer 的选项是使用同站点cookie。只有当请求直接来自您的站点时,它们才会发送。它们可能比 Referrer 更可靠,但并非所有浏览器都真正尊重它们。


推荐阅读