【问题标题】:Same-Origin Policy and serving JS from a CDN同源策略和从 CDN 提供 JS
【发布时间】:2012-09-14 16:04:56
【问题描述】:

我想从像 cloudflare 这样的 CDN 提供我的 JavaScript 脚本。

现在我的脚本通过 ajax 与我的应用服务器通信。当我从 CDN 加载这些脚本时,同源策略限制不会发挥作用吗?

假设我的应用在域中:

http://app.com

我从

加载我的脚本
http://cdn.com/xyz/all.js

现在,由于我的脚本是从与运行我的应用程序的域不同的域加载的,我想同源策略会阻止我与我的应用程序进行 ajax 通信。

我是不是搞错了?

【问题讨论】:

    标签: javascript same-origin-policy


    【解决方案1】:

    不,它会起作用。这就是 JSONP 起作用的原因。 脚本的“来源”是它执行的页面,而不是它的来源。

    如您所愿,这是一个参考(我找不到更好的,但 Crockford 是众所周知的)

    令人惊讶的是,src 属性不受同源策略的限制。这意味着可以创建一个脚本元素,该元素可以转到任何服务器,获取脚本并执行它。如果脚本导致传递 JSON 编码的数据,那么这是一件非常有用的事情。不幸的是,没有办法限制脚本或在执行之前对其进行检查。它以与页面中的脚本相同的权限运行。所以脚本可以访问和使用它的cookies。它可以使用用户的授权访问原始服务器。它可以检查 DOM 和 JavaScript 全局对象,并发送它在世界任何地方找到的任何信息。 Script Tag Hack 并不安全,应该避免。

    http://javascript.crockford.com/script.html

    不是真正的参考:如果这不起作用,没有人可以包含来自 Google 的 CDN 的 jQuery,然后使用它的 $.ajax 方法。

    【讨论】:

    • JSONP 工作的原因是因为您可以从任何地方GET 脚本。但我需要做的是 POST 到具有与脚本来源不同域的服务器。请进一步澄清您的答案
    • 从域 X 加载到域 Y 的代码只能向 Y 发出 AJAX 请求。
    • 使用脚本标签的src 属性加载脚本与使用XmlHttpRequest 加载数据无关。
    • 让我直截了当地说:origin(与同源策略一样)指的是 document。脚本恰好存在于 one 文档中(无论它是如何到达的),并且该文档来自 one 域。
    • 那么,一旦脚本存在于文档的域中,它就可以与该域对话,而不管脚本本身来自哪个域?
    猜你喜欢
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2012-08-22
    • 2010-09-25
    • 2014-06-05
    • 2011-04-08
    • 2021-04-02
    • 2014-02-01
    相关资源
    最近更新 更多