当前位置: 首页 > 知识库问答 >
问题:

为什么我的CORS配置没有导致服务器过滤传入请求?如何使服务器只接受来自特定来源的请求?

燕烨
2023-03-14

我想要我的Rails 5 API专用应用程序,现在运行在http://localhost:3000,仅接受来自my NodeJS前端应用程序的请求,目前运行于http://localhost:8888

所以我配置了/config/initializers/cors。rb像这样:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins "http://localhost:8888"
    resource "*",
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

我写了这个测试:

#/spec/request/cors_request_spec.rb

RSpec.feature "CORS protection", type: :request do
  it "should accept a request from a whitelisted domain" do
    get "/api/v1/bodies.json", nil, "HTTP_ORIGIN": "http://localhost:8888"
    expect(response.status).to eql(200)
  end
  it "should reject a request from a non-whitelisted domain" do
    get "/api/v1/bodies.json", nil, "HTTP_ORIGIN": "https://foreign.domain"
    expect(response.status).to eql(406)
  end
end

第一次测试如预期的那样通过了。但是第二个失败了,响应代码为200。为什么啊?

(顺便说一句,我不接受406响应代码;只是一个表示请求将无法满足的代码。)

共有1个答案

齐英朗
2023-03-14

CORS配置不会阻止服务器根据Origin请求头的值接受请求。你不能仅仅通过CORS配置来做到这一点。

当您在服务器上配置CORS支持时,服务器所做的不同只是发送Access-Control-允许-起源响应标头和其他CORS响应标头。

CORS限制的实际实施仅由浏览器完成。它不是由服务器强制执行的。

该协议的工作方式是,不管您在服务器端进行了什么样的CORS配置,服务器都继续接受来自所有客户端和源端的请求,否则它会这样做——因此来自所有源端的所有客户端都继续从服务器获得响应,就像其他客户端一样会。

因此,即使您在浏览器开发工具中看到一个错误,即来自前端JavaScript代码的跨源请求失败,您仍然能够在浏览器开发工具中看到响应。

但是,仅仅因为您的浏览器可以看到响应,并不意味着浏览器将向您的前端JavaScript代码公开响应。如果请求发送到的服务器选择允许请求,则浏览器仅将跨源请求的响应公开给在特定源运行的前端代码,方法是使用允许该源的Access Control Allow origin头进行响应。

因此,对于具有来源的任何请求请求头匹配https://foreign.domain,问题中的配置片段应该会导致浏览器在客户端发出一条消息,说http://localhost:3000/api/v1/bodies.json无法加载,因为响应中没有访问控制允许源站响应标头(因为您的配置导致服务器仅在响应您的白名单源站时发送该标头)。

但这是你通过CORS所能做的一切。您不能仅仅通过在服务器端执行任何CORS配置来阻止服务器端接受和响应来自特定来源的请求。如果你想这样做,你需要使用CORS以外的东西。

 类似资料:
  • 问题内容: 我正在尝试允许javascript与Node.js服务器通信。 POST请求(Web浏览器) 现在,Node.js服务器代码如下所示。在用于GET请求之前。我不确定如何使其与POST请求一起使用。 服务器(Node.js) 在此先感谢您的帮助。 问题答案: 以下代码显示了如何从HTML表单读取值。正如@pimvdb所说,您需要使用request.on(’data’…)来捕获正文的内容。

  • 问题内容: 如何检查是否从同一服务器发送了请求? 说,我的网域位于www.domain.com。现在,我有php处理文件,它将处理通过该域托管的表单。仅当请求是从域内发送时才执行此过程。www.domain.com以及从其他域发送的任何其他请求将被丢弃。 问题答案: 基本上:您不能。 使用HTTP协议,每个请求彼此独立。 第一个想法是检查Referer HTTP标头,但请注意: 可以伪造 (由浏览

  • 问题内容: 我使用node.js进行了以下简单的http服务器设置: 如您所见,当有请求传入时,我将其登录到控制台。现在,当我浏览到控制台时,显示出有两个连接: 为什么是这样? 问题答案: 通常是的要求。即使您没有头文件,也可以请求它,因为如果未在标头中设置相关文件,则规范会定义默认文件路径。 查找有关请求的最佳方法是: 客户端,方法是打开开发人员工具并查看“ 网络” 标签。 服务器端,通过记录

  • 如标题所示,设计服务层时的最佳实践是什么?。我明白服务层应该总是返回一个DTO,以便域(实体)对象保留在服务层中。但是控制器应该为服务层输入什么呢? 我提出以下三点建议: 方法1:在此方法中,域对象(Item)保留在服务层中。 方法2:这是服务层接收自定义请求对象的地方。我在AWS Java SDK和Google Cloud Java API中广泛地看到了这种模式 方法3:服务层接受DTO并返回域

  • 我知道这个话题已经贴了很多次了,但这个问题没有真正的解决办法。 最近,在一些应用程序中,我决定进行更新。这是将库版本(admob)更改为最新版本的一次小更新。我还将targetSdkVersion从25更改为26。几天后,我检查了admob上的统计数据,所有这些应用的填充率都降到了0!请求的数量也增加了。用于横幅和间隙。其他应用程序不受影响。 我认为有一些愚蠢的错误,但我在代码中找不到任何问题。

  • 本文向大家介绍跨域请求 Apache 服务器配置的方法,包括了跨域请求 Apache 服务器配置的方法的使用技巧和注意事项,需要的朋友参考一下 1.修改服务器配置文件 2.编辑httpd.conf 找下面这行,把#去掉,目的是开启apache头信息自定义模块 重点内容 意思是对这个域名的资源进行访问时,添加一个头信息 最后重启服务器生效 以上所述是小编给大家介绍的跨域请求 Apache 服务器配置