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

时间:2014-12-10 14:42:24

标签: javascript security xss same-origin-policy

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

现在想象一下,加载的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下的Cookies,但我可以访问页面上的所有DOM,以防万一,修改它。 这不是一个可能的安全问题吗?这不应该触发同源策略保护吗?

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

此外,上述示例是否也适用于HTTPS页面? (例如:https://example.net/index.htmlhttps://example.com/myscript.js

加载脚本

2 个答案:

答案 0 :(得分:12)

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

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


  

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

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


  

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

  

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

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

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

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


  

此外,上述示例是否也适用于HTTPS页面? (例如:https://example.net/index.htmlhttps://example.com/myscript.js

加载脚本

具有不同方案的网址具有不同的来源,就像具有不同主机名的网址一样。同源策略规则与原始规则相同,而不是原始特征。

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

答案 1 :(得分:3)

  

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

是的,这称为Cross-Site-Scripting (XSS)

这绝对是一个安全问题。

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

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

  

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

没有

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

  

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

执行此操作的唯一方法是将iframe 内的javascript沙箱放在不同的域上。

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

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

您仍需要小心设置正确的Cookie(不要使用通配符域等)。但它可以帮助。