我是论坛的版主。我们希望论坛有一种新的风格。我们正在考虑向用户宣布一项竞赛,以提出最好的 CSS 设计;我们将采用最好的提交。
这会有多危险?使用来自我们不信任的人的 CSS 样式有多危险?CSS 设计者是否可以向 CSS 样式本身添加恶意代码或功能?
我是论坛的版主。我们希望论坛有一种新的风格。我们正在考虑向用户宣布一项竞赛,以提出最好的 CSS 设计;我们将采用最好的提交。
这会有多危险?使用来自我们不信任的人的 CSS 样式有多危险?CSS 设计者是否可以向 CSS 样式本身添加恶意代码或功能?
不建议使用来自您不信任的来源且未经某种审查的 CSS 样式。
存在一些风险,尤其是在较旧的浏览器上。一些较旧的浏览器提供了一种在 CSS 中嵌入 JavaScript 的方法,以便浏览器加载 CSS 后立即自动执行 JavaScript。出现此问题的浏览器包括IE6、IE7,以及IE7兼容模式下的IE更高版本;还有 IE Mobile 8。(在那些较旧的浏览器中,这是通过 CSS 结构支持的,例如url
, expression(...)
, behavior
, -moz-binding
, -o-link
, 可能还有更多。)旧浏览器的这个弱点允许提供恶意 CSS 的攻击者执行 XSS 攻击可以执行的任何操作。使用来自攻击者的 CSS 样式基本上是一个自我造成的 XSS 漏洞。
幸运的是,现代浏览器已经关闭了所有这些 JavaScript 路径。不幸的是,一些用户仍在使用旧版浏览器,因此如果您使用来自不受信任来源的 CSS,您将使这些用户处于危险之中。
也就是说,我建议从风险管理的角度来看。风险有多大?好处有多大?在这种情况下,我怀疑这些好处可能值得冒一点风险,特别是如果您采取一些缓解措施来保护自己。我会推荐:
在将所有建议的 CSS 加载到您的站点之前,请查看它。确保你理解它,并且它没有被混淆。确保它看起来干净、组织良好且可读。确保它不加载外部 CSS 或其他外部资源。看看你觉得它是否合理。如果你发现它在做你不理解的事情,也许不要使用它。
检查来源。他们是否是您社区中值得信赖的用户,他们已经在您的网站上花费了很长时间?或者他们是你很少接触的新用户?来自站点受信任成员的风险可能较小,而来自未知的风险更大。
如果它是我正在运行的网站,我可能会这样做。是的,我会使用上述缓解措施来保护自己——但我不会让安全妨碍享受有趣的事情。
除了允许潜在的攻击者伪造用户界面看起来像别的东西(例如,使新的论坛消息表单看起来像登录表单)之外,还有可能将侧通道数据泄漏到外部服务。
一些示例攻击向量:
简而言之,CSS 可用于故意使页面的某些部分对页面上的某些特定数据进行大量计算。这可用于(缓慢)泄漏字节或位,例如 CSRF 机密。
也可以将字体子集为单个字母,并为以某种形式输入的每个新字母获取远程服务器 ping。或者为表单输入中的任何首字母获取不同的背景图像。在某些情况下(通常不可能,因为@import 必须位于 CSS 的开头,并且浏览器通常会在收到响应之前停止页面渲染),@import 可以用作并行通信通道,其中使用 long-poll 来允许页面渲染并仅在收到额外的侧通道泄漏数据时动态生成新的攻击 CSS。
我相信为了完全安全,您需要 CSS 解析器,其中包含要使用的可接受选择器、属性和函数的白名单。我们正在为传入的用户 CSS 运行内部解析器,我们的最大限制为 50 个 @media 规则、10 个 @font-face 规则和 25 个属性选择器。@import 仅允许来自指定的受信任 URL。此外,仅允许列入白名单的属性和值。
然后有一些极端情况,我不知道它们是否完全安全。请参阅允许 CSS 过滤器是否安全:url(data:<SVG SOURCE HERE>)?例如。
我不会考虑任何使用 CSS 的具有非标准额外攻击供应商的旧浏览器,因为它们容易受到许多已知攻击的影响,因此没有必要尝试保护它们。