【问题标题】:Splitting requests across domains—thwarting overzealous security跨域拆分请求——阻止过度安全
【发布时间】:2010-10-22 19:07:12
【问题描述】:

在 Steve (YSlow) Souder 的布道之后,我的网站 (LibraryThing.com) 将请求拆分到多个域以促进并行加载。我们做 CSS、JS 和图像;也可以做Flash等。我们也用谷歌的Prototype版本,是跨域的,不只是跨子域的。

这一切都对速度很有好处,但对于一小部分用户来说,它会出错。我认为问题出在过度安全设置,可能在 IE 中,但也可能在其他浏览器和/或上游系统中。我很惊讶 Souders 和其他人不讨论这个,因为我们知道很多。

问题是:处理此问题的最佳方法是什么?

现在,当它到达页面底部时,我们正在检查是否设置了在应该加载的脚本中声明的某个 JS 变量。如果没有设置,它会从主域获取它并设置一个 cookie,以便下次它不会从子域加载它。但是我们只是在底部重新加载了 JS,所以如果 CSS 也失败了,你就是在看垃圾。

有没有人有更好或更通用的解决方案?我在想可能有一个通用的“onload”或“onerror”脚本来设置cookie并加载内容?

【问题讨论】:

  • 你能发布一些代码吗?你在做这一切都是客户端吗?
  • 这只是一个客户端问题——我的网站可以去获取任何东西:)。我认为这个问题很笼统,以至于发布代码只会混淆问题,但这就是我们现在的做法。如果未设置 JS var,则在本地获取并设置 cookie。

标签: javascript css security optimization web


【解决方案1】:

如果这种行为至少总是影响 JS 文件,一种选择是保留一个 cookie,指示用户的浏览器是否已经针对这种行为进行了测试。如果它们尚未经过测试,请插入(作为标记中的第一个脚本元素)对跨域脚本的引用,该脚本只是将此 cookie 设置为“成功”。然后立即有一些内联 JS 将检查此 cookie,如果未设置,则设置为“失败”并重新加载页面。

然后在服务器端检查相同的 cookie,并确保跨站点请求不会发送给任何结果为“失败”的人。

此方法应确保使用支持跨站点请求的浏览器的用户不会看到任何奇怪的行为,但应立即为其他用户解决问题,代价是在他们第一次访问时自动刷新。

【讨论】:

    【解决方案2】:

    您是否有显示此行为的特定用户代理列表? 也许Apache conf可以解决这个问题? (或创建一个新问题供您解决:-))。

    当心 cookie 狂热 - 您添加的 cookie 越多(此外,在主域上),您的客户将不得不在他们的请求中发送它。

    Souders 也谈到了这一点,但检查您的客户端浏览器发送/接收请求的比率总是好的。

    【讨论】:

    • >User-agents 不。我想我们在使用 IE 中的安全设置之前已经复制了它。我假设它是一个普遍的安全问题。一些非常严格的设置假定页面不应该从其域之外获取——最重要的是 JS,还有 CSS。哎呀,您可以将浏览器设置为不从外部获取图像,以防您真的偏执。 >饼干 这是非常真实的。事实上,这就是使用辅助域的一个原因——正如 Souders 所建议的,从无 cookie 域中获取所有静态内容。
    【解决方案3】:

    我将对你的问题进行一些疯狂的猜测。

    缓存。您是否在脚本文件中进行了这些更改,这些问题用户可能拥有旧版本。 IE 6 的缓存非常糟糕。

    我注意到您的脚本在 url 中没有构建 #,XYZ.js?version=3 将强制浏览器不使用旧的缓存脚本,如 XYZ.ks?version=2。 (也适用于图像/Css)

    您的 HTML 中还混合了内联 javascript,它们也会被缓存。

    除非您的网站上有大量内容(巨大的页面),否则 3 个域可能会矫枉过正

    DNS 查找可能很昂贵,并且超时值很长。

    由于可能存在安全冲突,我不愿意将我的网站 javascript 放在单独的域中。您必须使您的 javascript/ajax 调用与域保持同步。看起来麻烦多于它的价值。

    我已经使用 i.domain.com 和 domain.com 5 年多了,没有任何问题。

    我敢打赌,将 JS 放回主域将解决您的问题。它肯定会让它变得不那么复杂,更容易处理。

    但如果操作正确,您的 3 个域应该可以正常工作。不幸的是,我在这个问题中没有足够的信息来找到问题。

    【讨论】:

    • 假设 LibraryThingTim 只使用一个域来“解决”他的问题。如果他尝试为他的 JS 使用跨域加载器(Dojo 和其他框架为您提供了这种可能性,即使使用一个域 - 相信我,它无论如何都会加快速度) - 那么同样的问题又来了。由于您加载 JS 的方式,安全策略也可能适用。
    猜你喜欢
    • 2021-06-26
    • 2014-10-13
    • 2019-11-04
    • 2017-02-06
    • 2017-01-04
    • 2014-12-27
    • 2020-01-03
    相关资源
    最近更新 更多