CORS策略是否会阻止非浏览器请求的资源访问?

时间:2017-04-16 01:11:37

标签: asp.net-core cors

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

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

4 个答案:

答案 0 :(得分:8)

  

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

不,它不会阻止任何其他客户端成功检索资源。

CORS协议仅由浏览器强制执行。它不是由服务器强制执行的。事实并非如果请求中缺少任何CORS详细信息,服务器会以某种方式阻止请求,或者拒绝发送响应。

相反,当您在服务器上配置CORS支持时,服务器执行的操作只是发送Access-Control-Allow-Origin响应头和其他CORS响应头。

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

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

GNU bison

请求被 Postman 服务器阻止并在我的实时服务器中抛出错误后返回 500 internal Server Error,如下所示:

code obfuscation

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

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));