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

Can a JavaScript hosted on different domain read/modify DOM of another domain?

本文关键字:修改 读取 另一个 DOM JavaScript      更新时间:2023-09-26

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

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

<!-- Page example.net/index.html -->
<script src="http://example.com/myscript.js"></script>

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

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

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

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

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


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

脚本加载到example.net中并托管在 example.com 上。它可以从example.net读取饼干。它无法从example.com读取饼干。(example.com上的服务器端代码可以动态生成JavaScript并嵌入从cookie中提取的数据(。


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

是的

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

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

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

不要从您不信任的站点嵌入 JS。


而且,此外,上面的示例也适用于HTTPS页面吗?(例如:https://example.net/index.htmlhttps://example.com/myscript.js加载脚本(

具有不同方案的 URL 具有不同的来源,就像具有不同主机名的 URL 一样。同源策略规则相同,因为它们基于原点而不是原点的特定特征。

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

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

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

这绝对是一个安全问题。

底线是,永远不要包含来自任何您不信任的域的代码。故事结束。

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

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

不。

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

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

做到这一点的唯一方法是将javascript沙盒化到位于不同域的iframe中。

因此,您可以创建一个sandbox.example.com域,该域生成一个包含javascript的包装器页面。

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

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