【问题标题】:Is including an external CSS file safe, or could it lead to code injection?包含外部 CSS 文件是否安全,还是会导致代码注入?
【发布时间】:2023-12-19 03:56:01
【问题描述】:

我正在开发一个客户将使用的网站,方法是将其嵌入到他们网站的 iframe 中。我想让他们能够自定义内容的样式,以便他们可以使其适合他们网站的样式。

我的基本想法是让他们给我一个 CSS 文件的 URL,我应该将其包含在我提供给他们的页面中以填充 iframe。据我所知这是安全的,但我对 CSS 不是特别熟悉(尤其是较新的版本),所以我想验证一下。

是否有人可以构建一个 CSS 文件,让他们将代码注入我的网站或以其他方式访问我的域的 cookie 之类的东西?这真的安全吗,还是我需要想出一个不同的解决方案?

【问题讨论】:

  • 我认为您最好允许用户将自定义样式粘贴到 textarea 中,然后您可以在将其包含在视图中之前验证它实际上是 CSS 并且没有任何危害。

标签: javascript css security xss


【解决方案1】:

不,这是不安全的。 expression-moz-binding 是通过 CSS 在某些浏览器上导致任意脚本执行的已知方法。 LiveJournal 遭受了非常公开的 XSS 攻击,这是由于用户提供的 CSS 中嵌入了 JavaScript。

由于 Mozilla 决定允许通过 CSS 执行任意 JavaScript,除了我们采用的解决方案之外,没有其他可行的解决方案。

来自Caja's attack vector wiki

精心设计的 CSS 样式表可以在某些浏览器的全局范围内执行未经处理的 javascript。

背景

CSS 包含多种用于更改周围标记和执行表达式的机制。

IE 有一个允许执行任意 javascript 的扩展。 expression 属性在 http://msdn2.microsoft.com/en-us/library/ms537634.aspx 中描述

利用动态属性的强大功能,现在不仅可以将属性值声明为常量,还可以声明为公式。 ... 对于脚本,动态属性可以是任何合法的 JScript 或 Microsoft Visual Basic Sc​​ripting Edition (VBScript) 语句。 http://msdn2.microsoft.com/en-us/library/ms533503.aspx

binding 允许绑定到外部指定的脚本 http://developer.mozilla.org/en/docs/CSS:-moz-binding & http://developer.mozilla.org/en/docs/XBL:XBL_1.0_Reference:Elements#binding

-moz-binding 允许通过 XML 接口进行绑定(也使用数据:URL)

假设

不受信任的代码可以生成样式元素或样式属性,或者添加任意 CSS 规则并创建触发这些规则的 DOM 元素。

版本

IE 5 及更高版本(但不是 IE 8 或更高版本的“标准模式”)。

Mozilla/Firefox,版本未知。

【讨论】:

  • 太棒了,感谢所有背景。看起来我必须有另一种机制让他们提供样式,我可以先对其进行消毒。现在要弄清楚如何清理 CSS...
  • Caja 项目保留了white lists 的 CSS 属性和值,这些属性和值很有用。它还内置了 Java 解析器和清理程序。
  • Caja 已移至 Github,白名单可在此处找到:github.com/google/caja/tree/master/src/com/google/caja/lang/css
最近更新 更多