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

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

有德业
2023-03-14

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

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

共有3个答案

劳星晖
2023-03-14

Curl和其他非浏览器http客户机必须忽略访问控制允许源文件标题。查看如何使用cURL调试CORS请求

佴德曜
2023-03-14

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

这是我的邮递员,我在其中设置了所有标题,如访问-控制-允许-起源:

请求被阻止从Postman服务器和返回一个500内部服务器错误后,错误抛出在我的实时服务器,你可以看到这里:

将Express/Node.js与cors2.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));
雍俊远
2023-03-14

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

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

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

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

该协议的工作方式是,无论您在服务器端进行什么CORS配置,所有客户端甚至浏览器都会像通常一样继续从服务器获得响应。但区别在于,curl或其他本机应用程序或后端服务器端编程环境(如PHP)不会阻止您的客户端代码访问响应,如果它不包含访问控制允许源响应头。但浏览器会。

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

但是仅仅因为您的浏览器可以看到响应并不意味着浏览器会将其暴露给您的前端JavaScript代码。浏览器只有在请求到达的服务器选择允许请求时,才会将跨源请求的响应公开给在特定源运行的前端代码,方法是使用允许该源的访问控制允许源报头进行响应。

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

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

 类似资料:
  • 有点晚了,但我记得我最终通过在后端的配置中设置来解决这个问题。 完全偶然地,我注意到如果我在前端的客户端中设置,一切都正常工作。然而,将其切换到不断抛出错误。然后我把两个和两个放在一起,在后端设置,一切都按预期工作。 我的应用程序使用cookie,所以必须这样做。 这可能是重复的,但我没有找到与我的问题相关的线索。 我正在进行以下API调用: 这会引发一个错误: 当我将我的应用程序部署到Herok

  • 我有一个。NET核心应用程序,它有一个REST API被一个角客户机使用,但遇到了CORS问题。 但仍在客户端(运行在本地端口4200上)中获取错误: CORS策略阻止从来源“HTTP://localhost:4200”访问位于“HTTP://localhost/myapi/api/table”的XMLHttpRequest:对飞行前请求的响应没有通过访问控制检查:它没有HTTP ok状态。

  • CORS策略已阻止CORS从源站对X处XMLHttpRequest的访问:对飞行前请求的响应未通过访问控制检查:它没有HTTP ok状态。 嗨,我正在努力解决我的问题与CORS拒绝我的Vue组件与外部API与axios的交互,因为它返回此错误。我尝试了使用Barryvdh的Cors头支持和制作中间件和自定义路由。这根本行不通。Barryvdh回购中README. md中提到的一切都已经完成,不幸的

  • 它是一个服务类,如下所示: 我试图通过将用户名和密码添加为let来发送用户名和密码,但它说我被CORS策略阻止了。 在这里,我在我的春靴里补充道: 在controller类中: 来自网络选项卡的消息

  • 我在Axios Laravel crossite中遇到问题,它返回以下erorr: CORS 策略阻止了从源“http://localhost:8000”在“http://localhost/moddle/moodle/login/index.php”处访问 XMLHttpRequest:对预检请求的响应未通过访问控制检查:请求的资源上不存在“访问控制-允许-源”标头。 我在stackoverfl