如何防止非浏览器客户端向我的服务器发送请求

IT技术 node.js reactjs express
2021-05-03 11:06:21

我最近使用 nginx 在同一个 vps 上部署了我的网站和后端,但是现在当我使用 PostMan 向http://IP:port/route发出请求时- 我从任何 PC 的服务器获得响应. 我认为这不是它应该如何工作。我将 CORS 选项设置为 origin : vps-IP (所以只有我的域),但我的服务器仍然接受来自 PostMan 的请求。有什么方法可以阻止我的后端接受这些请求,将域限制为我的域,也就是我的 vps ip?请求必须先绕过 nginx 吗?

另一个问题是保护我的网站;重要的请求和响应标头显示在浏览器网络选项卡中 - 例如授权 JWT 令牌,这是正常的还是存在安全风险?

2个回答

我认为这里关于 CORS 有点混乱。

跨源资源共享不用于桌面客户端到服务器/或服务器到服务器的调用。从链接:

跨源资源共享 (CORS) 是一种机制,它使用额外的 HTTP 标头告诉浏览器让在一个源(域)上运行的 Web 应用程序有权访问来自不同源的服务器的选定资源。当 Web 应用程序请求与自己的来源具有不同来源(域、协议和端口)的资源时,它会发出跨源 HTTP 请求。

所以它是另一个服务器的 Web 应用程序,它的实际功能是由浏览器实现的。

  1. 这是正常的吗?是的。这意味着使用 Postman 的人可以向您的服务器发出请求,您有责任确保您免受此类事件的侵害。浏览器会做的是查看您允许从哪些域调用您的服务器,如果它是尝试访问资源的不同域,它们将阻止它。设置可以访问您的资源的域列​​表是您/您的服务器的责任,但执行该策略是浏览器的责任。Postman 不是浏览器,因此它不一定实现此功能(也不是必须)。

  2. 如果您在标头中显示/泄露令牌(在与您已通过身份验证或登录之前进行身份验证的设备不同的设备中) - 这是一个严重的安全问题。如果它发生在您已登录的设备上并且仅在您登录后发生,那么这是意料之中的。这是假设您不会以任何其他方式泄露信息并正确设计/实施它。

  3. 您所担心的事情有预防机制。而且您可能在使用这样的服务时甚至没有注意到它,您的托管/云部署提供商可能已经实施或与另一家公司/工具达成协议,因此您可能已经受到保护。最好检查一下!

这些

是第一个出现在快速搜索中的付费服务,我相信还有更多。还有一些简单的实现可以提供一些保护:

Nodejs - 快速 CORS:

npm i --save cors然后requireimport根据您的用例。

为了使服务器到服务器和REST工具,如邮差访问我们的API -

var whitelist = ['http://example.com']
var corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin) !== -1 || !origin) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

app.use(cors(corsOptions));

禁用服务器到服务器和 REST 工具(如 Postman)来访问我们的 API -!origin从您的 if 语句中删除

var whitelist = ['http://example.com']
var corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

app.use(cors(corsOptions));

它真的很容易实现,并且 express cors module有很多可用的选项。在此处查看完整文档https://expressjs.com/en/resources/middleware/cors.html