【问题标题】:User Uploaded CSS safe?用户上传的 CSS 安全吗?
【发布时间】:2011-07-02 07:41:20
【问题描述】:

是否有人可以使用用户上传的 CSS 来破坏网站?如果我想允许用户将自己的 CSS 主题上传/共享到网站,我应该寻找或禁止什么?

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

【问题讨论】:

  • 不,这不安全。有相当多的恶意可能性。
  • 我一直在寻找更少的是/否,更多的例子来寻找什么。
  • 我认为您应该更清楚地定义您的担忧。蹩脚或损坏的样式表是否属于“棘手”类别?一个写着*{display:none}的呢?我假设您的意思是公开敏感数据或将数据发送给第三方,但这里的人们似乎只关心使页面变得丑陋或损坏(或者用:after 内容说脏话:D)。
  • 顺便说一下,试试*{display:block} 一段时间,看看会发生什么。不漂亮。在此页面上的 Firebug 中试用。
  • 如果他们想完善他们的页面,那是他们的事。我只是想确保他们在大多数情况下不能执行代码,如果他们与其他人共享这个 CSS 主题,它就无法获取他们的 cookie 或其他东西。

标签: css security


【解决方案1】:

我相信以标准方式解析的标准 CSS 是安全的。但是,通过各种非标准扩展CSS is unsafe

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

即使您解决了这些特定问题,也没有什么能阻止浏览器供应商在您没有意识到的情况下以其他方式欺骗您。

作为一般规则,我不会允许不受信任的用户上传文件,除非我为每个用户提供自己的子域并确保主站点上的任何 cookie 仅限于 www 主机。这使得浏览器认为每个用户都有自己的独立站点和自己独立的安全上下文,因此即使他们设法执行代码,也不会损害任何东西。

【讨论】:

    【解决方案2】:

    即使您为有效的 CSS 解析文件,黑客仍然可能通过使用 :before and :after 之类的东西来进行恶意攻击。为确保安全,您需要在验证中将 css 属性和选择器的子集列入白名单。

    【讨论】:

    • +1 用于白名单,但我会将选择器和属性添加到列表中,当您偏执时,没有理由采取一半措施。
    • 请原谅我的无知,但是:before:after 的内容可能是恶意的吗?也许我不会像你一样想到“恶意”?
    • @mu-is-too-short 我同意选择器,我将编辑我的答案。 @Wesley-Murch 我认为您可能可以使用 :before 或 :after 添加javascript代码,但在查看之后,似乎情况并非如此。我认为 op 只希望用户为网站设置样式,而不是添加内容,因此它仍然可能被视为恶意。
    • @Wesley:您可以在:before:after 中包含url(nefarious_content_or_tracking_trick),也可以对url() 使用相同的url() 技巧等。
    • 我不得不投反对票,我不确定您希望如何充分解析用户提供的样式表以获取“安全”选择器、属性或值。据我们所知,用户可以尝试上传带有.css 扩展名的javascript、php、图像或PDF 文件,或者只是一个错误的文本文件。我们如何解析这个?你说得好像它是微不足道的。 @mu - url() 方面的优秀点,但正如你所指出的 - 它不限于之前/之后。
    【解决方案3】:

    它们可以包含一个本质上是 Javascript 的 .htc 文件。实际上,它甚至不需要在 .htc 文件中,您可以使用 expression() 在 CSS 中编写 Javascript。而且(尽管已给出),他们可能会通过不恰当地隐藏/显示内容来扰乱您的网站。

    【讨论】:

    • 他们不是也必须上传 .htc 文件才能完成这项工作吗?我可能是错的,但我认为不可能为 htc 跨域提供服务。
    • @Wesley 我假设如果这是为了让用户能够对网站进行皮肤处理,它也会提供一种上传资产的方式吗?无论如何,您也可以在 expression() 中编写 Javascript。
    【解决方案4】:

    您主要需要注意上传的内容。如果你做某种健全性检查,它是有效的 CSS,你应该没问题,但如果你只允许上传任何旧文件,有人可能会潜入一些 java 脚本或其他恶意代码。

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

    但我想说,只要您检查安全清单并验证您的内容至少是一些 css,就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-14
      • 2023-03-29
      • 2011-04-27
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多