【问题标题】:Restrict api access in Node JS express限制 Node JS express 中的 api 访问
【发布时间】:2020-06-06 20:14:55
【问题描述】:

我有一个包含一些 API 路由的快速服务器,如下所示:

server.post("/api/send-email", (req, res) => {

   });
});

您不需要身份验证令牌来访问 API,但我只希望我的网站 mydomain.com 能够使用它。 我尝试过像这样启用限制访问:

function restrictAccess(req, res, next) {
      if (req.headers['origin'] !== 'http://localhost:3000') {
        res.sendStatus(403);
      } else {
        next();
      }
    }

然后我将限制访问作为中间件传递到我的路由中。 当我使用邮递员发出 POST 请求时,我无法再使用 API,但我可以更改原始标头并再次访问它。

如何只允许来自mydomain.com 的请求?我已经在互联网上搜索了很长时间,但找不到任何东西。有没有可能?

【问题讨论】:

  • 简而言之,你不能。任何像邮递员或任何脚本这样的工具都不能发送它想要的任何标题,因此标题本身对于限制对您域中网页的访问是无用的。这就是网络的工作方式。限制访问通常需要用户登录或类似的东西(可能设置一个您可以检查的 cookie),然后如果您发现您的 API 被滥用,您可以禁止/删除正在执行此操作的特定用户帐户。

标签: node.js express cors


【解决方案1】:

如何在 mydomain.com 上只允许来自我自己网页的请求?

简而言之,你不能。任何工具,如邮递员或任何脚本(如 node.js、PHP、Perl 等)都可以发送任何标头或其他请求参数它想要这样标题本身对于限制对您域中网页的访问是无用的。

这就是网络的运作方式。

限制访问通常需要用户登录或类似的凭据(可能设置一个您可以检查的 cookie),然后如果您发现您的 API 被滥用,您可以禁止/删除特定的用户帐户正在做。

还有其他技术可以让脚本或工具更有效地使用您的 API,但即使是它们也不能免于想要投入工作的黑客。例如,您的服务器可以生成一个令牌,将其嵌入到您的网页中,然后每当您从您的网页发出 API 请求时,您就可以从网页中包含该令牌。您的服务器,然后检查是否存在有效令牌。您要确保令牌在合理的时间内过期,这样黑客就无法获得一个并长时间使用它。

一个坚定的黑客仍然可以在他们想要使用它时从您的网页中刮取一个令牌,所以这只是一个障碍,而不是阻止一个坚定的黑客的东西。

这里唯一真正的解决方案以及像 Google 用户这样的 API 用户需要在每次 API 调用时提供某种凭证,然后检测您的服务器以防止滥用 API(速率限制、意外使用等...)如果该证书被滥用,则撤销该证书。凭据可以是开发人员令牌(与某些 Google API 一样),也可以是来自用户登录的某种身份验证凭据(例如 cookie)。

我以前见过一些其他技巧,其中 API 只有在通常来自您的网页的一系列请求之前才能正常工作。这需要更多的工作来实现和维护,但是如果您的网页通常会发出对网页的请求,然后进行两次 ajax 调用,然后请求五张图像,然后调用 API,您可以以某种方式让您的服务器跟踪这个来自特定浏览器的事件序列,并且仅当您看到看起来像是来自真实浏览器网页的预期事件序列时,才允许 API 调用工作。再说一遍,这需要做很多工作,但仍然不是万无一失的,因为坚定的黑客可以使用 puppeteer 之类的东西来自动化实际的浏览器。

【讨论】:

  • @jona - 这回答了你的问题吗?如果是这样,您可以通过单击答案左侧的复选标记向社区表明这一点,这也将为您在此处遵循正确的程序赢得一些声誉积分。
【解决方案2】:

主要浏览器在发送原始标头时不允许任何浏览器 Javascript 对其进行修改。

非浏览器 API 客户端(如 Postman 和其他任何东西)可以将原始标头和其他标头设置为他们选择的任何内容。非浏览器 API 客户端可以轻松欺骗您的 API 伪装成浏览器。

因此,安全提示使用原始标头的值来决定是否授予对 API 的访问权限不会为您提供任何安全性。

您确实需要某种令牌访问机制。特别是对于发送电子邮件的 API。如果网络爬虫找到您的 API,您的托管服务将指责您发送垃圾邮件。

对此感到抱歉。 :-( 安全是一件令人头疼的事情。

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2018-06-22
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多