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

托管在不同域上的JavaScript能否读取/修改另一个域的DOM?,javascript,security,xss,same-origin-policy,Javascript,Security,Xss,Same Origin Policy,我有一个关于JavaScript的潜在安全问题/限制的问题,该JavaScript托管在一个域(例如:CDN的域,例如example.com),但从另一个域(例如example.net)下的网站加载 现在想象一下,加载的JavaScript将只读取/修改具有特定id的div中的文本,因此没有什么“复杂的”。 一个例子:我从以下位置加载脚本,并在以下位置执行:[注意不同的TLD!] <!-- Page example.net/index.html --> <script src=

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

现在想象一下,加载的JavaScript将只读取/修改具有特定id的
div
中的文本,因此没有什么“复杂的”。 一个例子:我从以下位置加载脚本,并在以下位置执行:[注意不同的TLD!]

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

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

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


此外,上述示例是否也适用于HTTPS页面?(例如:从加载脚本)

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

JS本身所在的URL是不相关的


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

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


但是,我可以访问页面上的所有DOM,并在万一的情况下对其进行修改

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

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

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

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


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

具有不同方案的URL具有不同的来源,就像具有不同主机名的URL一样。同一原产地政策规则与基于原产地而非原产地特定特征的规则相同

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

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

是的,这个叫

这绝对是一个安全问题

总之,永远不要包含来自任何域的您不信任的代码。故事结束了

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

这难道不应该触发同源政策保护吗

没有

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

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

实现这一点的唯一方法是在不同域上的iframe中对该javascript进行沙箱处理

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

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


您仍然必须小心地正确设置cookies(不要使用通配符域等)。但是它会有帮助。

是的,这正是为什么CDN被用来加载js文件的原因。谢谢你的详细回答。关于cookie,如果我想从example.com设置一个“全局”cookie(通过包含JS脚本的set cookie标头发送的cookie响应),该cookie可以从从从example.com(CDN)加载脚本的所有站点读取,我应该假设这是不可能的,对吗?正确。请参阅答案中关于使用服务器端代码的说明。但是,如果我根据Http Referer头设置cookie的域(解析它并仅提取主机名),我可以设置仅与加载javascript的特定域相关的cookie。这是处理外部请求设置的Cookie的正确方法,还是Http Referer不应用于这种情况?@CarmineGiangregorio-你不能这样做。Cookie规则不允许您设置外部域。