【发布时间】:2017-09-11 23:09:57
【问题描述】:
据我了解,使用 CORS 模块会从资源中删除 Access-Control-Allow-Origin 标头,导致浏览器的 XmlHttp 请求失败。
但是,这是否会阻止来自 CURL 或其他本机应用程序/网络服务器(即通过 PHP 编写和运行的请求)的 Http 请求成功地从该资源中检索数据?
【问题讨论】:
标签: asp.net-core cors
据我了解,使用 CORS 模块会从资源中删除 Access-Control-Allow-Origin 标头,导致浏览器的 XmlHttp 请求失败。
但是,这是否会阻止来自 CURL 或其他本机应用程序/网络服务器(即通过 PHP 编写和运行的请求)的 Http 请求成功地从该资源中检索数据?
【问题讨论】:
标签: asp.net-core cors
Curl 和其他非浏览器 http 客户端必须忽略 Access-Control-Allow-Origin 标头。看
How can you debug a CORS request with cURL?
【讨论】:
但是,这是否会阻止来自 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 配置以外的其他方式。
【讨论】:
Ajax 不是跨域的,出于安全原因,任何主流浏览器都不允许这样做。除非您的接口服务器和您的网站具有相同的域
【讨论】:
如果域不在我的白名单中并通过动态设置请求的来源,我可以成功地阻止像 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));
【讨论】: