用户上传的CSS安全吗?

6

有没有什么棘手的问题,某人可以通过用户上传的CSS来损害网站?如果我想让用户上传/共享他们自己的CSS主题到一个网站上,有什么我应该寻找或禁止的东西吗?

编辑:假设我知道如何检查它是否是有效的CSS文件等。我正在寻找需要避免的CSS特定漏洞。


不,这并不安全。存在相当多的恶意可能性。 - thirtydot
我在寻找更多的实例,而不仅仅是简单的肯定或否定。 - Brent
1
我认为你应该更清楚地定义你的关注点。一个糟糕或损坏的样式表是否属于“棘手”的类别?那么像*{display:none}这样的样式呢?我猜你的意思是暴露敏感数据或将数据发送给第三方,但这里的人似乎只关心让页面变丑或损坏(或者用:after内容说脏话:D)。 - Wesley Murch
顺便说一下,试试 *{display:block} 然后看看会发生什么。不太好看。在这个页面上用 Firebug 试试吧。 - Wesley Murch
如果他们想搞砸他们的页面,那是他们的事。我只是想确保他们不能执行代码,如果他们与其他人分享这个CSS主题,它也不能获取他们的cookie或其他信息。 - Brent
4个回答

3

我认为标准的CSS,以标准方式解析是安全的。然而,通过各种非标准扩展CSS是不安全的

不仅仅是CSS不安全,由于一些浏览器忽略RFC 2616并嗅探内容类型而不是尊重Content-Type头部,因此有可能欺骗某些浏览器将JavaScript嵌入静态图像文件中。

即使您解决了这些特定问题,也没有阻止浏览器供应商以其他方式欺骗您而您意识不到。

作为一般规则,除非我为每个用户提供自己的子域并确保主站点上的任何cookie都限制在www主机上,否则我不会允许不受信任的用户上传文件。这使得浏览器看起来每个用户都有自己独立的站点和安全上下文,因此即使他们成功执行代码,也不会危及任何内容。


2

他们可以包含一个名为.htc的文件,它实际上是Javascript。实际上,它甚至不需要在.htc文件中,你可以使用expression()在CSS中编写Javascript。并且(尽管这是显而易见的),他们可以通过不当地隐藏/显示东西来干扰您的站点。


1
他们不是也得上传.htc文件才能实现这个吗?我可能错了,但我认为跨域提供htc是不可能的。 - Wesley Murch
@Wesley 我假设如果这是为了让用户能够自定义网站的外观,它也会提供上传资源的方式?无论如何,你也可以在expression()中编写Javascript。 - pixelfreak

2

即使您解析了有效的CSS文件,黑客仍然可以使用诸如:before和:after之类的内容进行恶意攻击。为确保安全性,您需要在验证中将CSS属性和选择器的子集列入白名单。


1
+1 为白名单加分,但我会将选择器和属性也添加到列表中,当你变得过于谨慎时,没有半点措施是多余的。 - mu is too short
2
请原谅我的无知,但是 :before:after 内容可能有什么恶意吗?也许我对“恶意”没有你的想法那样深刻? - Wesley Murch
@mu-is-too-short 我同意使用选择器,我会编辑我的回答。 @Wesley-Murch 我之前以为可以使用 :before 或 :after 添加 JavaScript 代码,但是经过了解,这是不可能的。我猜测 OP 只希望用户可以样式化网站,而不是添加内容,因此仍然可以被视为恶意。 - Mike Neumegen
@Wesley:你可以在 :before:after 中包含一个 url(nefarious_content_or_tracking_trick),你也可以使用相同的 url() 技巧来处理 background-image 等。 - mu is too short
我不得不投反对票,我不确定你如何期望充分解析用户提供的样式表以获取“安全”的选择器、属性或值。我们都知道,用户可能会尝试上传一个带有.css扩展名的javascript、php、图像或PDF文件,或者只是一个混乱的文本文件。我们该如何解析这个问题?你说得好像这很简单。@mu - 在url()方面提出了很好的观点,但正如你所指出的那样 - 它不仅限于before/after。 - Wesley Murch
显示剩余4条评论

1

在上传文件时,您需要特别小心。如果您进行某种合理性检查,确保它是有效的CSS,那么您就应该没问题了。但是,如果您允许任何旧文件被上传,有人可能会潜入一些JavaScript或其他恶意代码。

实际类型并不具有危害性,但整个上传概念是问题所在,因为它允许攻击者传递您意想不到的负载。

但我认为只要您勾选了安全检查清单并验证您的内容至少是一些CSS,那么您就应该没问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接