我有一个关于域上托管的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.html从https://example.com/myscript.js)
加载脚本答案 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.html
从https://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(不要使用通配符域等)。但它可以帮助。