托管在不同域上的JavaScript是否可以读取/修改另一个域的DOM?

Car*_*rio 8 javascript security xss same-origin-policy

我有一个关于域上托管的JavaScript的潜在安全问题/限制的问题(例如:CDN的域,比如example.com),但是从不同域(例如example.net)下的网站加载.

现在想象一下,加载的JavaScript只会读取/修改div带有特定id的文本,所以没有什么"复杂".示例:我从http://example.com/myscript.js加载脚本,并在http://example.net/index.html上执行:[注意不同的TLD!]

<!-- Page example.net/index.html -->
<script src="http://example.com/myscript.js"></script>
Run Code Online (Sandbox Code Playgroud)

我知道我无法从JavaScript访问mysite.com下的Cookies,但我可以访问页面上的所有DOM,以防万一,修改它.这不是一个可能的安全问题吗?这不应该触发同源政策保护吗?

是否有用户代理阻止托管在不同域上的JavaScript访问执行脚本的页面中的元素?

此外,上述示例是否也适用于HTTPS页面?(例如:https://example.net/index.html从https://example.com/myscript.js加载脚本)

Que*_*tin 15

客户端JavaScript中的所有基于URL的安全性限制都基于包含<script>加载JS 的元素的网页的URL .

JS本身托管的URL无关紧要.


现在,我知道我无法从JS访问mysite.com下的Cookies.

该脚本已加载example.net并托管在其中example.com.它可以从中读取cookie example.net.它无法读取cookie example.com.(服务器端代码example.com可以动态生成JavaScript并嵌入从cookie中取出的数据).


但是,我可以访问页面上的所有DOM,以防万一,修改它.

是

这不是一个可能的安全问题吗?这不应该触发同源政策保护吗?

这是一个潜在的安全问题,但它不应该触发同源策略.

通过加载脚本,页面的作者信任托管脚本的站点.

不要从不信任的网站嵌入JS.


此外,上述示例是否也适用于HTTPS页面?(例如:https://example.net/index.html从中加载脚本https://example.com/myscript.js)

具有不同方案的URL具有不同的来源,就像具有不同主机名的URL一样.同源策略规则与它们基于原点而非原始特征相同.

有时,您将获得额外的限制,其中禁止通过HTTPS加载的页面访问通过HTTP加载的内容,因为这会破坏SSL安全性.这是与同源策略无关的不同安全限制.


irc*_*ell 6

这不是一个可能的安全问题吗?

是的,这称为跨站脚本 (XSS)。

这绝对是一个安全问题。

底线,从不包含来自任何域、您不信任的代码。故事结局。

如果攻击者可以让代码在您的域上运行,那么游戏就结束了。

这不应该触发同源策略保护吗?

不。

同源策略基本上意味着脚本只能查看/修改它加载到的域的 DOM 。因此,除非开启 CORS,或者您的脚本也在那里运行,否则您无法为任意站点创建 iframe 并从父站点读取该 DOM 。

也许,是否有用户代理阻止托管在不同域上的 Javascript 访问执行脚本的页面中的元素?

做到这一点的唯一方法是在不同域的 iframe 中对该 javascript 进行沙箱处理。

所以你可以创建一个 sandbox.example.com域,它生成一个包含 javascript 的包装页面。

然后,不是直接链接到 JS,而是创建一个到沙盒域的 iframe。JS 将可以访问该域以及该 DOM 中的所有内容,但不能访问 iframe 之外的任何内容。

您仍然必须小心正确设置 cookie(不要使用通配符域等)。但它可以提供帮助。