内容安全策略(CSP)如何实际防止攻击?

3

据我理解,内容安全策略头部(或页面头部的元标签)指定了允许在网页中加载哪些元素。

这意味着,如果攻击者能够修改页面内容,并添加调用有害 JavaScript 脚本的代码,则该脚本不会被加载,因为它来自 CSP 没有明确允许的域名。

这样说是否正确?

如果是这样的话,是什么阻止攻击者修改 CSP 头本身,从而使其脚本得以调用?


如果攻击者可以修改页面的内容,那么他们已经获胜了。CSP 的想法是首先防止恶意脚本(或其他资源)执行。如果一个可信任的脚本干扰了 CSP,那么这个可信任的脚本就是问题所在(并且不应该被信任)。 - CertainPerformance
2
@CertainPerformance 这并不完全正确。CSP头部无法被JavaScript更改,并且它胜过可能会被“搞乱”的元标记。CSP的整个重点在于,如果攻击者确实修改了页面的内容,一切都不会丢失。这真正是它的表达目的,以防止攻击者所做的修改造成伤害。 - user229044
@meagar 啊,所以所有的Javascript只能修改HTML标签,而不能修改实际的初始头部,浏览器只关心初始头部? - CertainPerformance
2
@CertainPerformance 浏览器将遵守更为严格的规定。因此,恶意脚本可以添加一个更宽松的<meta>标签,但如果头部更为严格,则会被忽略。实际上,元标记只能加强头部指定的内容,而不能放宽它。 - user229044
1个回答

3

有许多情况下攻击者可以修改页面,但不能修改头文件。

例如,注入脚本的XSS攻击将能够注入其他脚本,但无法修改随初始页面发送的标头。CSP可以防止注入的脚本运行,并且还可以防止其加载任何其他脚本。

CSP是深度防御的一个例子。即使在攻击者完全接管托管页面的服务器时它失败,也并不意味着它没有价值。


@Kaiido 请参考 https://writingexplained.org/defence-vs-defense-difference 和 https://meta.stackoverflow.com/questions/252503/are-british-international-english-terms-acceptable-e-g-brackets-instead-of。 - user229044
很抱歉,作为一个法语使用者,“defence”是常见的一个错别字,正确应该是“défense”。 - Kaiido
@Kaiido 没问题,作为一个上网的加拿大人,我习惯了我的拼写被视为错误 :) - user229044
这很有道理,我一直在考虑一种中间人攻击,可以让他们更改标题,但没有想到在页面加载后进行另一种攻击。 - NDUF
1
@NDUF 是的,内容安全策略(CSP)是更大解决方案的一部分。CSP 无法保护免受中间人攻击(MITM 攻击),其中攻击者可以修改标头或拦截整个请求。这是 SSL 的任务,用于初始连接,并使用子资源完整性(Subresource Integrity)来包含脚本。在攻击者实际上已经入侵服务器的情况下,任何下游安全性都无法帮助 CSP。 - user229044

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