【问题标题】:How to prevent non-browser clients from sending requests to my server如何防止非浏览器客户端向我的服务器发送请求
【发布时间】:2019-05-16 17:43:23
【问题描述】:

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

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

【问题讨论】:

  • 什么?如果您的后端通常无法访问,那么您的前端将如何工作?
  • 它们在同一台服务器上,我希望 nginx 将 api 调用重定向到 localhost,后端
  • 同一台服务器可能会为前端文件提供服务,但它们实际上会在客户端上运行。他们需要能够从那里访问后端。
  • 我明白,但我真的是部署后保护网站的新手,但如果有人知道 vps 的 ip,他们可以很容易地发送数千个请求,而不仅仅是邮递员,是这样吗?对,否则我无能为力。

标签: node.js reactjs express


【解决方案1】:

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

Cross Origin Resource Sharing 不用于桌面客户端到服务器/或服务器到服务器的调用。从链接:

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

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

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

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

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

这些

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

【讨论】:

    【解决方案2】:

    Nodejs - Express CORS:

    npm i --save cors,然后是 requireimport,具体取决于您的用例。

    启用服务器到服务器和 REST 工具(如 Postman)访问我们的 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 - 从您的 if 语句中删除 !origin

    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 模块有很多可用的选项。在此处查看完整文档https://expressjs.com/en/resources/middleware/cors.html

    【讨论】:

    • 这就是我想要的。谢谢
    • 这不会阻止邮递员,您只需在邮递员内部的请求标头中发送来源即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2016-02-27
    相关资源
    最近更新 更多