我正在使用knitrBootstrap
进行一些项目,我开始学习JQuery(Javascript)和CSS,以便对生成的页面进行一些修改。我也理解,通常CSS文件和脚本放在单独的文件中并从同一个域(或本地)加载到HTML文档,但是当我读到两个库的文档时,我看到它们可以从CDN加载提供程序以及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>
这看起来非常好,因为它允许在托管时从第三方提供程序加载静态资源并在自己的服务器上备用资源。但是,我也有点担心安全性(不完全是出于我的目的,而是针对使用这种情况的网页),因此对其进行了搜索。我发现了Same-Origin策略的概念,据我所知,JQuery提供的函数不应该被允许更改页面本身的DOM对象,而是这样做。
为什么JQuery代码和Bootstrap CSS允许更改剩余文档,即使它们不是从同一个域加载而是从另一个加载(在这种情况下是CDN)?
答案 0 :(得分:1)
没有什么可以阻止CDN更换文件了,而且更为关注的是,除了任何未知的安全措施之外,没有什么能阻止某人 else 在没有CDN意识到的情况下恶意替换这些文件在那里。
社区通常愿意忽略该潜在标志的原因是因为CDN的一个巨大好处:所有用户都能够为给定文件使用完全相同的CDN。例如,假设每个主要站点都使用CloudFlare CDN链接进行JQuery。这意味着当您作为用户访问另一个也使用它的主要站点时,您可以使用该文件的可能缓存副本来保存您自己的带宽。这当然提出了另一个重点:网站没有浪费任何自己的带宽来提供文件或处理它的请求。
但是,回答你的问题,同源策略不适用于加载脚本或CSS;它适用于页面内请求(请参阅:ajax) 您的脚本,以避免跨站点脚本(XSS)。这里的意图是,作为网站创建者,您应该控制加载哪些脚本,但是您的页内请求可能很容易制作跨站点请求,因此可能会暴露不应公开的数据(例如,会话变量)。关键是当浏览器向CDN发出请求时,它不会向CDN提供您的会话变量或任何其他不应该获取的cookie(您的域名)。但是,一旦脚本能够执行, 就可以访问您域名的cookie,并且可以将其转发到任何其他站点,而不会使用同源策略。
与Javascript不同,CSS实际上并不直接执行代码,而是指定了一系列对您的页面具有视觉效果的属性(这会导致浏览器执行代码以实现它,包括可能下载CSS使用的图像)。