允许嵌入任意外部样式表到我的网页是否安全?

10

我有一个动态的网页,想让其他人通过iframe嵌入他们自己的网页中,不一定需要任何高级技术如JavaScript。

我考虑让他们通过HTTP GET参数提供自己的样式表,通过URL和<link type="text/css" rel="stylesheet" href…在我的页面上嵌入这些外部样式表。

这种做法安全吗?会违反我的网站安全范式吗?我知道使用CSS可以插入额外的文本,甚至可以删除元素(这也是我为用户提供此功能的全部意义),但还有其他需要注意的吗?

恶意的人是否可以通过这样的CSS向我的网站插入链接,从而获得我的HTTP Referer并潜在地违反某些检查,或者CSS插入仅限于文本?


从外部资源导入某些东西可能会带来安全风险。但是回答你的“链接”问题:不会。它们可以隐藏元素,添加文本等等,但是不可能使用CSS创建链接(或者至少浏览器应该防止跨站点脚本)。 - Linus Caldwell
3
请参阅层叠样式表中的跨站脚本攻击 - Robert Harvey
这不是 https://dev59.com/amzXa4cB1Zd3GeqPPxVe 的重复,我的网站上没有任何文本输入。我只想允许引用外部样式表,不在自己的域上存储任何用户输入。 - cnst
但是你正在链接一个包含文本的CSS,对吗?而且那个CSS可能包含恶意内容,对吗?无论CSS来自文本框还是链接表格,保护原则都应该是相同的。 - Robert Harvey
@RobertHarvey,我不知道链接文件会包含什么。问题是不同的--我的问题是让其他网站所有者以他们认为合适的方式嵌入我的内容(非同源CSS),你找到的那些其他问题是关于让最终用户自定义站点(在同源域上托管的CSS)。有些答案可能相关/有帮助,但问题和问题域完全不同。 - cnst
2个回答

5
通常情况下,不允许第三方CSS是不安全的,因为某些实现允许在CSS中使用JavaScript,这意味着允许用户修改您的CSS会使他们在您的页面上下文中执行任意JavaScript代码。
然而,如果这个页面被认为是“白标签”页面,它似乎是嵌入到其他网站中并且它真正属于您的页面只是一种实现细节,那么这似乎不是一个主要的问题。指定“第三方”CSS的人是网站所有者,所以在那一点上它并不是真正的第三方 - 他们不会对自己进行跨站脚本攻击!
但是,除了网站所有者之外,没有人应该将CSS放在旨在由您控制的页面上,因为它实际上是由控制CSS的人控制的。

这也是我的看法。当然,网站所有者可能会插入恶意内容,但他们为什么要这样做呢? - Robert Harvey
嗯,你看,该网站旨在供终端用户(大多数情况下没有外部CSS,但可能会使用一些cookie)和Web开发人员(使用外部CSS)使用,我不想通过为每个组使用两个不同的域来使事情变得太复杂。那么,JavaScript在CSS中将在哪个上下文中执行?它能否(a)添加链接,以便我的页面显示为引用者,并且(b)从我的域读取、更改或设置cookie,或者进行其他类似的操作? - cnst
@cnst:这取决于实现方式。不同代理商中有各种功能可能会导致脚本执行,而我并不了解大多数代理商的具体情况。最安全的假设是“它相当于让人们在您的页面上放置任意SCRIPT标记”。 - Chuck
@Chuck,这并不等同于让人们在您的页面上放置任意“脚本”——区别在于使用来自第三方域的任意CSS时,任何可能的漏洞都是由有漏洞和旧版本的浏览器造成的。所以,在所有这些中,几乎只有MSIE受到影响?我的网站面向开发人员,所以我认为运行MSIE的人已经完了,因此也许从这个潜在的漏洞中忽略他们是有道理的(因为如果不是这个漏洞,肯定还有其他漏洞)。 - cnst
唉,我想我可能不得不自己测试一下是否使用我的域的源执行了那些提到的功能(例如可以读/写cookie);然后如果是这样,并且只有MSIE和旧版本的Gecko受到影响,那么也许要进行浏览器嗅探,而不是嵌入提供的样式表,嵌入空白或嵌入某种通用样式表,最可能适合其他设计。到目前为止,我发现旧版Gecko可能确实存在漏洞:http://www.securiteam.com/securitynews/5LP051FHPE.html http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-0496 - cnst

0

CSS无法插入可链接的内容。它只能样式化、定位和隐藏已有的内容。当然,人们可以通过:before:after文本来破坏你的页面,也许会使事情看起来有点混乱或更改现有链接的标签,但不能更改URL本身。


并不完全正确。不幸的是,一些浏览器决定允许从CSS中调用一些JavaScript函数。(我在看你,IE 7+8,Opera和Firefox!) - Simon East

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