邮递员的CORS


89

这个问题被问了几次,但我还是不明白:

当我阅读有关的答案时

没有“ Access-Control-Allow-Origin”标头

问题,它说应在请求的服务器上设置一个设置,以允许跨域:add_header 'Access-Control-Allow-Origin' '*';

但是,请告诉我为什么在向邮递员(是客户端)询问时,它的工作原理很吸引人,并且我收到所请求服务器的答复?

谢谢


24
邮递员不在乎SOP,它只是一个开发工具,而不是浏览器。
穆萨

2
@Musa好的,如果是浏览器(客户端)问题,为什么我必须在服务器上进行某些修改?
IsraGab '16

7
它是服务器,它告知浏览器对于给定的站点可以访问其内容,是否可以通过CORS进行访问,而浏览器则对其表示
赞赏

我有完全相同的问题。在电子的情况下,如何以编程方式做到这一点。
mluis

8
真正的问题是如何配置POSTMAN来模仿首先发送ORIGIN请求的浏览器行为。本质上,您如何使POSTMAN像浏览器一样工作,因为我们需要进行测试以确保正确配置了我们的API。那么,如果该API在POSTMAN上有效并且由于浏览器的CORS而中断,该怎么办?这意味着该API是无用的。
克里斯·洛夫

Answers:


50

正如@Musa所说,原因似乎是:

邮递员不在乎SOP,它是开发工具,而不是浏览器

顺便说一下,这里是一个chrome扩展名,目的是使其在您的浏览器上正常工作(这个扩展名是chrome,但您可以找到FF或Safari)。

如果您想了解有关跨域的更多信息,以及为什么它对扩展有效,请点击此处


5
那么,如何保护从Postman之类的工具访问我的API路由?例如,需要验证码验证的API。但是,如果直接从Postman访问,则验证码验证将被绕过
Sadman Muhib Samyo

5
扩展的链接已损坏。
jayarjo

除此以外,相同的问题是,扩展如何才能打破单一来源策略?
伊万·科特斯·罗梅罗

chrome-extension的链接已损坏
OhadR

44

如果您使用网站,并且填写表格来提交信息(例如您的社会保险号),则要确保将信息发送到您认为要发送到的网站。因此,浏览器在默认情况下会说“请勿将信息发送到所访问域以外的其他域)。

最终这变得太局限了,但是默认的想法仍然保留在浏览器中。不要让网页将信息发送到其他域。但这就是所有浏览器检查。Chrome和firefox等内置代码表示“在发送此请求之前,我们将检查目标位置是否与所访问的页面匹配”。

邮递员(或cmd行上的CURL)没有内置的检查。您正在与网站进行手动交互,因此可以完全控制要发送的内容。


2
更准确地说,邮递员不会发送将被检查的XmlHttp请求,而是发送顶级网络调用(例如您在新的浏览器选项卡上打开URL),因此即使在扩展范围内也不会被踢
tgkprog

浏览器不会检查您的站点是否正在将数据发送到另一个域:如果另一个域站点允许所有起源,则您的浏览器可以100%接受。相反,它保护另一个域,以防您的站点未经授权使用其资源。
XouDo

35

CORS(跨源资源共享)和SOP(相同源策略)是客户端决定强制执行的服务器端配置。

与客户相关

  • 大多数浏览器 都会强制执行它,以防止发生与CSRF攻击有关的问题。
  • 大多数开发工具 都不关心它。

10

尽管这里的所有答案都很好地解释了cors是什么,但是直接回答您的问题将是由于邮递员和浏览器存在以下差异。

浏览器:OPTIONS在向API端点发送任何新请求之前,发送调用以检查服务器类型并获取标头。它在哪里检查Access-Control-Allow-Origin。考虑到这一点,Access-Control-Allow-Origin标头仅指定允许所有的CROSS ORIGINS,尽管默认情况下浏览器仅允许相同的起源。

邮差:发送直接GETPOSTPUTDELETE等没有检查什么类型的服务器是和获取的头请求Access-Control-Allow-Origin通过OPTIONS调用服务器。


“在向API端点发送任何新请求之前,发送OPTIONS调用以检查服务器类型并获取标头” –事实并非如此。它仅对非简单请求执行此操作。
昆汀

1

通常,Postman用于调试并用于开发阶段。但是,如果您甚至想阻止邮递员阻止它,请尝试此操作。

    const referrer_domain = "[enter-the-domain-name-of-the-referrer]"
    //check for the referrer domain
    app.all('/*', function(req, res, next) {
      if(req.headers.referer.indexOf(referrer_domain) == -1){
        res.send('Invalid Request')
      }

      next();
    });

使用路由器将代码添加到文件中。如果您的文件带有“路由器”,请在文件顶部添加代码。您拥有的相同文件:const express = require('express')const app = express(); const cors = require('cors');
samceena,

app.js如果node app.js用于运行服务器,请对其进行编辑。
巴拉斯·帕巴

这样可以保护您的服务器免受ddos影响吗?
SuperUberDuper

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.