【问题标题】:content distribution network (CDN): Loading CSS or Javascript library内容分发网络 (CDN):加载 CSS 或 Javascript 库
【发布时间】:2014-01-20 01:39:18
【问题描述】:

我在一些项目中使用knitrBootstrap,我开始学习 JQuery (Javascript) 和 CSS 以对生成的页面进行一些修改。我也明白,通常 CSS 文件和脚本放在单独的文件中,并从同一个域(或本地)加载到 HTML 文档,但是当我阅读这两个库的文档时,我发现它们可以从 CDN 加载provider 并且从 knitrBootstrap 生成的 HTML 文件也这样做。

例如:http://rawgithub.com/jimhester/knitrBootstrap/master/vignettes/illusions.html(第 18-24 行)

<!-- jQuery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>

<!-- bootstrap -->
<link href=https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css rel="stylesheet">
<script src="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>

这看起来很不错,因为它允许从第三方提供商加载静态资源,并在托管时在自己的服务器上备用资源。但是,我也有点担心安全性(不完全是出于我的目的,而是针对一般使用此功能的网页),因此对其进行了搜索。我找到了同源策略的概念,据我了解,不应该允许 JQuery 提供的功能更改页面本身的 DOM 对象,而是这样做。

为什么 JQuery 代码和 Bootstrap CSS 允许更改剩余的文档,即使它们不是从同一个域而是从另一个域(在本例中为 CDN)加载的?

【问题讨论】:

    标签: javascript jquery css cdn


    【解决方案1】:

    没有什么能阻止 CDN 替换文件,更令人担忧的是,除了任何未知的安全措施外,没有什么能阻止某人 else 在 CDN 不知情的情况下恶意替换这些文件在那里。

    社区通常愿意忽略这个潜在标志的原因是因为 CDN 的一个巨大好处:所有用户都能够对给定文件使用完全相同的 CDN。例如,假设每个主要站点都为 JQuery 使用 CloudFlare CDN 链接。这意味着当您作为用户访问另一个也使用它的主要站点时,您可以通过使用可能缓存的文件副本来节省您自己的带宽。这当然会引出另一个要点:网站不会浪费任何自己的带宽来提供文件或处理文件请求。

    但是,谈到您的问题,Same Origin 政策不适用于加载脚本或 CSS;它适用于页面内请求(请参阅:ajax)by 您的脚本,以尽量避免跨站点脚本(XSS)。这里的意图是,作为站点创建者,您应该控制加载哪些脚本,但是您的页内请求可能很容易被欺骗以发出跨站点请求,从而可能会暴露不应暴露的数据(例如,会话变量)。关键是,当浏览器向 CDN 发出请求时,它不会向 CDN 提供您的会话变量或任何其他不应获取的 cookie(您的 域的)。但是,一旦脚本能够执行,它确实可以访问您域的 cookie,并且它可以将这些 cookie 转发到没有同源策略的任何其他站点。

    与 Javascript 不同,CSS 实际上并不直接执行代码,而是指定了一堆在您的页面上具有视觉效果的属性(这会导致浏览器执行代码来实现它,包括可能下载 CSS 使用的图像) )。

    【讨论】:

    • 感谢您的解释pickypg
    • 那么,一旦加载了可能受到威胁的脚本,它就可以查询所有 cookie 和会话变量,并使用带参数的简单 GET 将其发送到第三方服务器?还有为什么 ajax 会被同源策略阻止?它的核心不只是对任何远程服务器的 GET 吗?最后一个问题:我似乎无法找到关于这个特定主题的更多文献(带有 CDN 链接的 JS)。你有一些提示吗?非常感谢您的帮助:)
    • 是的,受感染的脚本可以轻松地将您的 cookie(以及通常作为结果的会话信息)发布到第三方服务器,但它不必只是通过查询字符串。 Ajax 不限于发出GET 请求。它可以使用GETPOSTPUTDELETE 等。它被阻止以防止这种确切的场景轻松发挥作用(不幸的是,它很容易解决; 见JSONP)。关于 JavaScript 和 CDN 没什么好说的。无论 CDN 是什么,您要么下载,要么不下载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多