- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
tl; dr;关于同一原产地政策
我有一个Grunt进程,用于启动express.js服务器实例。直到现在,当它开始为空白页提供服务时,它的工作情况都非常好,在Chrome(最新版本)的开发人员控制台的错误日志中显示以下内容:
XMLHttpRequest无法加载https://www.example.com/
请求中没有'Access-Control-Allow-Origin'标头
资源。因此,不允许访问源'http://localhost:4300'。
是什么阻止了我访问该页面?
最佳答案
tl; dr —答案的末尾有一个摘要,以使查找相关部分更加容易。建议您阅读所有内容,因为它提供了有用的背景知识,可帮助您理解为什么这样做的原因,从而使您更容易了解如何在不同情况下应用。
关于同一原产地政策
这是Same Origin Policy。它是浏览器实现的安全功能。
您的特殊情况显示了如何为XMLHttpRequest实现它(如果使用fetch,您将获得相同的结果),但它也适用于其他情况(例如,将图像加载到<canvas>
或文档加载到< cc>),只是实现方式略有不同。
(很奇怪,它也适用于CSS字体,但这是因为铸造厂坚持使用DRM,而不是出于Same Origin Policy通常涵盖的安全性问题)。
可以使用three characters演示表明需要SOP的标准方案:
爱丽丝是一个使用网络浏览器的人
鲍勃经营一个网站(在您的示例中为<iframe>
)
Mallory运行一个网站(在您的示例中为https://www.[website].com/
)
爱丽丝已登录到鲍勃的网站,并且那里有一些机密数据。可能是公司的Intranet(仅可通过LAN上的浏览器访问)或她的在线银行(仅可通过输入用户名和密码后获得的cookie进行访问)。
爱丽丝访问了Mallory的网站,该网站具有一些JavaScript,这些JavaScript导致爱丽丝的浏览器向鲍勃的网站发出HTTP请求(从她的IP地址,她的cookie等)。这可能与使用http://localhost:4300
并读取XMLHttpRequest
一样简单。
浏览器的同源策略禁止JavaScript读取Bob网站返回的数据(Bob和Alice不想让Mallory访问)。 (请注意,例如,您可以使用responseText
元素在各个原点之间显示图像,因为图像的内容不会暴露在JavaScript(或Mallory)中……除非您将画布放入混合中,否则会生成一个同源冲突错误)。
为什么在您认为不应采用同一来源政策时
对于任何给定的URL,可能不需要SOP。在这种情况下,有两种常见的情况:
爱丽丝,鲍勃和马洛里是同一个人。
鲍勃(Bob)提供完全公开的信息
…但是浏览器无法知道以上两个条件是否成立,因此信任不是自动的,因此会应用SOP。在浏览器将数据提供给其他网站之前,必须明确授予权限。
为什么“相同来源策略”仅适用于网页中的JavaScript
浏览器扩展<img>
,浏览器开发人员工具中的“网络”选项卡以及Postman等应用程序均为已安装的软件。他们并没有将数据从一个网站传递到属于另一个网站的JavaScript,这仅仅是因为您访问了另一个网站。安装软件通常需要更明智的选择。
没有第三方(Mallory)被视为风险。*
必须仔细编写浏览器扩展,以避免跨域问题。 See the Chrome documentation for example。
为什么不使用JS即可在页面中显示数据
在许多情况下,Mallory的网站可能会导致浏览器从第三方获取数据并显示(例如,通过添加*
元素以显示图像)。不过,Mallory的JavaScript不可能读取该资源中的数据,只有Alice的浏览器和Bob的服务器可以做到这一点,因此它仍然是安全的。
CORS
错误消息中引用的<img>
HTTP响应标头是CORS标准的一部分,该标准允许Bob显式授予对Mallory站点的访问权限,以通过Alice的浏览器访问数据。
一个基本的实现将只包括:
Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: http://example.com/
Access-Control-Allow-Origin
请求标头动态生成该消息,以允许多个但不是所有站点访问它。
Origin
添加到特定URL的CORS实现经常因此而被绊倒。
Access-Control-Allow-Origin
中使用的Content-Type)。
enctype
(而不是
OPTIONS
,
GET
或您尝试执行的任何操作)发送),并使用正确的
POST
标头以及正确的
Access-Control-Allow-Origin
和
Access-Control-Allow-Methods
进行响应,以允许您使用特定的HTTP方法或标头。
Access-Control-Allow-Headers
和其他CORS响应标头。这些不属于请求,对您没有任何帮助(可以授予权限的权限系统的意义是什么?),并且必须仅出现在响应中。
Access-Control-Allow-Origin
标头放在没有请求主体来描述其内容的GET请求上(通常在作者混淆
Content-Type: application/json
和
Content-Type
时)。
Accept
API(而不是
fetch
),则可以将其配置为不尝试使用CORS。
XMLHttpRequest
进行请求且没有获得使用CORS查看响应的权限时,Chrome给出了Chrome错误消息,说明了如何执行此操作:
fetch
”到“
https://example.com/
”的访存访问已被CORS策略阻止:请求的资源上不存在“
https://example.net
”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。
fetch("http://example.com", { mode: "no-cors" });
Access-Control-Allow-Origin
元素以JavaScript程序的形式加载数据而工作,该JavaScript程序调用了页面中已存在的函数,因此尝试在返回JSON的URL上使用JSONP技术将失败—通常会出现CORB错误—因为JSON不是JavaScript。
关于javascript - XMLHttpRequest无法加载XXX No'Access-Control-Allow-Origin' header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41139828/
XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allow
Git diff 似乎在比较时返回不同的变化: git diff origin/master ... origin/branch git diff origin/master...origin/bra
我正在研究 3.1 Git Branching - Branches in a Nutshell 中的 git 分支概念 我正在玩虚拟存储库。 git log --oneline --decorate
我知道有很多类似的问题,唯一的区别是我从 **same ** 域提供的两个页面得到了这个。这可以在下面的示例中看到。 Uncaught DOMException: Blocked a fram
我被要求使用 Fork Workflow,即我必须处理具有相同或相似名称的多个分支。我为什么要使用这些不同的变体? 以下是不同命名约定的一些示例: 我的分支机构 起源我的分支 起源/我的分支机构 远程
这个问题已经有答案了: How do I delete a Git branch locally and remotely? (41 个回答) 已关闭 9 年前。 好的,我已经创建了一个 origin
这是我关于如何让 lerna 在 Jenkins 中运行的一系列问题的一部分。 上一期: lerna publish on Jenkins "git remote update" Fails "Cou
当我尝试从我的 Angular 6 应用程序访问 Webhdfs 时,我收到如下所示的错误。在我看来,我几乎尝试了所有方法,包括更改 core-site.xml 和 hdfs-site.xml 中的设
我正在从不同的来源向我的服务器发出 Ajax POST 请求以供用户登录。我已经在我的 application_controller.rb 中正确设置了 Cross Origin header : d
我刚刚克隆了一个存储库并在 Git 中开始了一个新分支。我已经这样做了很多次而没有遇到问题。今晚当我尝试使用 git branch --set-upstream develop origin/deve
我对 Git 还很陌生,但仍在掌握它的窍门。我最近才开始使用分支机构,遇到了一些问题。 我有两个开发系统,一个 Ubuntu 桌面和一个 MacBookPro。我在 Ubuntu 系统上的一个新的 o
这个问题在这里已经有了答案: Why does "git push main" work on GitHub when "git push master" does not? Also what i
我想从我的应用访问一个 API。 curl 请求是: curl --request POST https://... --header 'Authorization: Token ...'
我试图理解的遗留 makefile 具有 -Wl,-z,origin,-rpath,'$ORIGIN/../lib' 好的,我看到 -Wl 表示以下是链接器选项;逗号将替换为空格。 GNU ld 的联
我正在寻找 OpenShift Origin 和 OpenShift Enterprise 之间的主要区别。我知道第一个是开源的,后者是商业版。与开源版本相比,OpenShift Enterprise
我在 Sourcetree 中有这个历史图表: Sourcetree graph 如何将最后一次提交从 origin/development 复制到 origin/master 分支? 第二个问题:图
运行 git 命令时空格和斜杠有什么区别? 我有时会看到 git push origin master(这是一个空格) 还有其他时候我看到 git rebase origin/master(使用斜杠)
根据文档,git pull 执行 git fetch 然后执行 git merge,但是在那种情况下执行 git pull origin master 应该执行 git fetch origin ma
我正在使用我的 git 存储库,并在早些时候对 master 分支进行了相当多的提交。现在我意识到它有点太吵了,我想将所有这些 merge 到一个提交中。 102381 commit z .... 1
我制作了一个小的 xslt 文件来创建一个名为 weather.xsl 的 html 输出,代码如下: 我想将 html 输出加载到 html 文件中的 div 中,我正在尝试
我是一名优秀的程序员,十分优秀!