【问题标题】:Will CORS policy prevent resource access from non-browser requests?CORS 策略会阻止来自非浏览器请求的资源访问吗?
【发布时间】:2017-09-11 23:09:57
【问题描述】:

据我了解,使用 CORS 模块会从资源中删除 Access-Control-Allow-Origin 标头,导致浏览器的 XmlHttp 请求失败。

但是,这是否会阻止来自 CURL 或其他本机应用程序/网络服务器(即通过 PHP 编写和运行的请求)的 Http 请求成功地从该资源中检索数据?

【问题讨论】:

    标签: asp.net-core cors


    【解决方案1】:

    Curl 和其他非浏览器 http 客户端必须忽略 Access-Control-Allow-Origin 标头。看 How can you debug a CORS request with cURL?

    【讨论】:

      【解决方案2】:

      但是,这是否会阻止来自 CURL 或其他本机应用程序/网络服务器(即通过 PHP 编写和运行的请求)的 Http 请求成功地从该资源中检索数据?

      不,CORS 配置不会阻止非浏览器内容成功检索您的资源。

      同源策略仅由浏览器强制执行。它不是由服务器强制执行的。 (而且 CORS 是一种放宽同源策略的方法。)如果请求中缺少任何 CORS 详细信息,服务器不会以某种方式阻止请求或拒绝发送响应。

      当您在服务器上配置 CORS 支持时,服务器所做的所有不同之处只是发送 Access-Control-Allow-Origin 标头和其他 CORS 响应标头。

      该协议的工作方式是,无论您在服务器端进行何种 CORS 配置,所有客户端(甚至浏览器)都会像往常一样继续从服务器获取响应。但不同的是,curl 或其他原生应用程序或后端服务器端编程环境(如 PHP)不会阻止您的客户端代码访问响应,如果它不包含 Access-Control-Allow-Origin 响应标头。但浏览器会。

      具体来说,即使您在浏览器开发工具中看到来自前端 JavaScript 代码的跨域请求失败的错误,您仍然可以在浏览器开发工具中看到响应。

      但仅仅因为您的浏览器可以看到响应并不意味着浏览器会将其暴露给您的前端 JavaScript 代码。浏览器仅将来自跨域请求的响应暴露给在特定来源运行的前端代码,前提是请求的服务器选择允许该请求,通过使用允许该来源的Access-Control-Allow-Origin 标头进行响应。

      但浏览器是唯一这样做的客户端。浏览器是唯一实现同源策略和 CORS 协议的客户端。 curl 或其他本机应用程序或 HTTP 客户端请求在服务器端运行时(如 PHP)不实现 CORS 协议,因此您无法通过在服务器端进行任何 CORS 配置来阻止来自它们的请求。

      因此,如果您想阻止来自非浏览器客户端的资源请求,则需要使用 CORS 配置以外的其他方式。

      【讨论】:

      • 服务器到服务器调用的 cors 等价物是什么?也许不是一个精确的等价物,例如如果数据不符合条件,我不希望调用者 api 拥有数据。我知道身份验证方法,我想知道是否有替代方法
      • 对于服务器到服务器的调用,没有与 CORS 等效的方法。同源策略和 CORS 基本上只是在浏览器中运行的前端 JavaScript 代码——代表这些用户从单个用户的计算机在客户端运行。服务器端代码根本不是这样运行的,所以服务器端不需要像同源策略限制这样的东西,所以不需要像 CORS 这样的东西来缓解这些限制。身份验证方法确实是服务器端运行时中唯一与远程相关的东西——显式身份验证或基于 IP 地址或其他。
      【解决方案3】:

      Ajax 不是跨域的,出于安全原因,任何主流浏览器都不允许这样做。除非您的接口服务器和您的网站具有相同的域

      【讨论】:

      • 这是不适用的,因为这不是通过浏览器完成的,也没有强制执行/遵守 CORS 政策。
      【解决方案4】:

      如果域不在我的白名单中并通过动态设置请求的来源,我可以成功地阻止像 Postman 这样的服务器在受 CORS 保护的 API 路由中向我发送请求。

      这是我的邮递员,我在其中设置了所有标题,例如Access-Control-Allow-Origin:

      该请求被 Postman 服务器阻止,并在我的实时服务器中引发错误后返回 500 internal Server Error,如您在此处看到的:

      使用 Express/Node.js 和 cors 2.8.5 版,我的代码如下所示:

      const whitelistDomains = [
          'http://awesomesite123.com',
          'https://localhost:3000',
      ];
      
      const corsOptions = {
        origin: function (origin, callback) {
          if (whitelistDomains.includes(origin)) {
            callback(null, true)
          } else {
            callback(new Error('Not allowed by CORS'))
          }
        },
        optionsSuccessStatus: 200, // For legacy browser support
        methods: ['GET', 'PUT', 'POST', 'DELETE'],
      }
      
      app.use(cors(corsOptions));
      

      【讨论】:

        猜你喜欢
        • 2021-09-19
        • 2021-09-15
        • 2019-03-30
        • 2015-03-09
        • 2015-01-08
        • 2019-08-10
        • 2019-08-20
        • 2022-01-14
        • 2021-02-28
        相关资源
        最近更新 更多