【问题标题】:Does the same-origin-policy prevent JavaScript on a page from accessing the contents of cross-domain loaded resources like <img> and <script>?同源策略是否会阻止页面上的 JavaScript 访问跨域加载的资源(如 <img> 和 <script>)的内容?
【发布时间】:2020-05-22 06:25:07
【问题描述】:

根据PortSwigger的description的同源策略(见下文),页面上的JavaScript无法读取跨域加载资源的内容,如&lt;img&gt;、&lt;video&gt;和&lt;script&gt;,在那个页面上。

但是,this 之类的答案表明:

当 mysite.com 打开一个标签时,该脚本在 当前页面。

或者换个说法:

脚本的起源是它被包含的地方。

那么,PortSwigger 到底是什么意思?如果页面上的 JavaScript 代码无法读取&lt;script&gt;s 的内容,那么 jQuery 和其他从 CDN 加载的 JavaScript 框架如何在页面中使用?

同源政策是如何实施的?(PortSwigger)

同源策略通常控制 JavaScript 代码对跨域加载的内容的访问权限。通常允许跨域加载页面资源。例如,SOP 允许通过&lt;img&gt; 标签嵌入图像、通过&lt;video&gt; 标签嵌入媒体,以及通过&lt;script&gt; 标签嵌入JavaScript。但是,虽然这些外部资源可以由页面加载,但页面上的任何 JavaScript 都无法读取这些资源的内容。

【问题讨论】:

  • 查看developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image作为JS访问图片的例子。
  • @Teemu - 谢谢,我已经阅读了你的页面。我看到了,例如如果设置了crossorigin,则&lt;img&gt; 只能由 JavaScript 使用。你会详细说明吗?这是特例吗?确实,外部脚本 (&lt;scripts src="..."&gt;) 与它所包含的页面一起运行?
  • 差不多就是这样。我无法比这些人在 MDN 上已经解释的更清楚。是的,从第三方服务器加载的脚本在您的域下运行,就像您从自己的服务器加载它一样,它甚至无法访问它来自的服务器,除非在该服务器上设置了 CORS服务器。一个例外是,您无法访问跨域脚本元素的 text 属性,这将访问实际内容,就像访问受污染的画布一样。

标签: javascript html same-origin-policy


【解决方案1】:

当mysite.com打开一个标签时,该脚本运行在当前页面的范围内——这句话的意思是当yoursite.com/new.js被mysite.com引用时,@的内容987654324@ 将不被视为mysite.com 的外部对象。

new.js 将在当前页面的范围内运行(即mysite.com)就好像new.js 是从mysite.com(或任何其他相关站点)加载的。

PortSwigger 的声明解释说,浏览器能够通过 HTML 标签引用远程图像或视频,但 javascript(无论是从 mysite.com 还是 yoursite.com 加载)将不会能够访问远程图像/视频。

【讨论】:

  • 谢谢。我在哪里可以看到所有这些形式化的东西?我认为有很多边缘情况或特殊情况。
  • 这是一本好书link
  • 是否没有正式的同源策略规范,例如 RFC?
  • SOP 是一个安全概念,而不是协议限制。每个浏览器实现此概念的方式甚至存在细微差别。 Wiki 页面说所有现代浏览器都实施某种形式的同源策略,因为它是重要的安全基石。[7] 政策不需要完全符合规范
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多