如何使 Node API 只能由 Web 应用程序访问?

Posted

技术标签:

【中文标题】如何使 Node API 只能由 Web 应用程序访问?【英文标题】:How to make Node API only accessible by web app? 【发布时间】:2018-11-12 21:26:54 【问题描述】:

我正在开发一个使用 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。

【问题讨论】:

使用 CSRF 令牌:***.com/questions/5207160/… What is a CSRF token ? What is its importance and how does it work?的可能重复 【参考方案1】:

快速回答是不,你不能。

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

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

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

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

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

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

【讨论】:

如果另一个站点正在窃取 API,该站点的后端仍然可以欺骗 Referrer 标头和 cookie。正如您所说,唯一的“真正”保护是每个请求都需要一个 API 密钥,因此至少您知道 在窃取,并且要求仅在成功提交 reCAPTCHA 之类的内容时才生成 API 密钥,因此无法自动生成 API 密钥,您可以记录生成 API 密钥的用户的 IP 地址,这很有用,除非用户使用 *** 或其他形式的代理。 @PatrickRoberts 他们只能在代理请求时伪造引荐来源网址,这就是您的常规速率限制应该生效的地方。验证码是一个不错的选择,但该网站可以将验证码代理回用户无论如何,这是在浏览网站(虽然它在技术上更难)。我认为在这种情况下,按 IP 阻止是更好的解决方案,因为大多数站点都有一个专用 IP,而且作为用户,我个人不喜欢验证码

以上是关于如何使 Node API 只能由 Web 应用程序访问?的主要内容,如果未能解决你的问题,请参考以下文章

c# .net web api webapi如何返回一个数据使浏览器弹出一个窗体?

如何创建只能由前端访问的私有api?

如何使 Django REST JWT 身份验证与多个 Web 服务器一起扩展?

如何使 .NET Web Api 仅对我的应用程序私有

如何在 Node/Express 应用程序中处理 api 版本

如何使 Angular 指令只能由一个组件使用?