【问题标题】:How to restrict API access to only authorized domains using Express.js?如何使用 Express.js 将 API 访问限制为仅授权域?
【发布时间】:2015-01-04 22:36:18
【问题描述】:

我正在为我的 Node.js/Express.js 应用程序设置一层安全性,我想限制对 authlist(授权列表)域的访问。

注意authlist 的反义词是denylist

纲要:

  • 用户在我的系统上创建Project
  • 每个Project 都会发出一个Public KeySecret Key,用于创建签名请求。
  • 此外,任何给定Project 的管理员都需要提供他们希望能够访问给定Project 的API 的域的authlist。这是在基于 Web 的控制台中完成的,而不是作为每个请求的一部分。
  • API 收到请求时,req.get('origin') 用于确定请求的源域。
  • 根据authlist 检查来源,并相应地允许或拒绝。

在代码中

var app = require('express');

app.post('/my-api-endpoint', function(req,res) {

    var originDomain = req.get('origin');   /// e.g. mysite.com
    /// Origin is then checked against the authlist array of domains

});

问题

  • 关于域来源,我需要注意哪些问题 欺骗?
  • 这是一个值得的安全功能吗?或者它很容易被欺骗以至于没有必要打扰?

【问题讨论】:

  • 这可能适用于服务器,但对于您通常知道 IP 地址的服务器,因此使用它更容易。对于客户端,无法保证您看到的 IP 地址将与原始计算机相关,或者它根本不会解析为域。这不包括任何会使事情进一步复杂化的恶意活动。这可能不值得实施。
  • 我实际上已经使用 IP 白名单实现了这个,但问题是,如果我有一个客户想要在 AWS Auto-Scaling-Group 这样的环境中托管他们的应用程序,那么他们就是不想在每次应用扩展时都更新 IP 白名单。感谢您的信息。
  • 在我看来,您应该颁发身份验证凭据并以这种方式规范对 API 的访问。然后,您的客户可以使用他们想要的任何基础设施,而这不关您的事。
  • 我想我会把它设为可选,如果他们有一个静态 IP 的服务器,用户可以打开 IP 白名单。
  • @AJB req.get('origin') 并不总是被定义为并非所有浏览器都可能不尊重发送它,用户可能会伪造标题中的来源,更不用说 req.get(' origin') 几乎总是在 HTTPS/SSL 上未定义,我假设您正在使用它。

标签: javascript node.js api express cross-domain


【解决方案1】:

完成您正在寻找的最佳方法是完全忘记域,并可选择允许将 IP 范围列入白名单。话虽如此,世界上一些最大的 API 甚至不使用这个安全层(即 eBay、亚马逊的 Marketplace 等......)。

不过,为了解决额外的偏执,您可以让您的客户设置子网来启动他们的自动缩放服务器,从而为他们提供一个静态 IP 范围以列入白名单。然后,只有在此 IP 范围内的服务器才会被授予访问您的端点的权限。

这是 AWS 上的一个问题,对此进行了更多解释: https://forums.aws.amazon.com/thread.jspa?threadID=233469

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2015-07-17
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多