知识卡片

CSP用白名单从架构层面阻断脚本注入,而非只依赖转义这道最后防线

普通读书笔记卡

内容

面对XSS(跨站脚本攻击),最直接的防御手段是转义——把用户输入中可能被浏览器解释成HTML/JavaScript标签的特殊字符(如&、<、>、’、”等)替换成安全的转义形式,让恶意输入始终只能以纯文本的方式呈现、不会被当成可执行代码解析。但转义的问题在于它是一种”逐处打补丁”式的防御:转义规则本身在HTML、JS、URI等不同上下文里各不相同,非常容易被开发人员在某处遗漏,只要有一处该转义而没转义,攻击者就可能找到突破口。CSP(内容安全策略)提供了一种更根本的补充思路:不再依赖”每一处输出都被正确转义”这个脆弱的假设,而是由浏览器在页面加载阶段就强制执行一份白名单策略——比如只允许加载指定域名下的JavaScript脚本、禁止执行所有内联脚本和eval,即使攻击者真的成功往页面里注入了一段恶意脚本,只要这段脚本不满足白名单策略(它是内联的、或者来自未被信任的域名),浏览器就会直接拒绝执行它。这个案例给出一条通用的纵深防御原则:像转义这样”依赖每一处代码都正确处理”的防御手段天然存在遗漏风险,更稳妥的做法是在更靠近执行环节(这里是浏览器本身)的位置,用一层与具体业务代码无关的白名单策略兜底,即使前面的防线百密一疏,后面这层策略仍然能把实际的执行拦下来。

参考来源

- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.5 互联网主要安全威胁分析及应对方案"节,"7.5.2 威胁应对方案","1.XSS"及"2.CSP"(源文件:_epub-src/OEBPS/Text/Chapter7_5_3.xhtml) - 结论依据:原文说明"对于XSS来说最好的解决办法就是转义!但做好转义并不容易,因为转义有很多种方式,而且很容易被开发人员忘掉……CSP(Content Security Policy)是防止XSS攻击的大招……目前github.com采用的方式,即禁止所有Inline JavaScript、eval,只加载指定域名下的JavaScript脚本,是目前最严格的一种CSP部署方式",直接支撑本卡片结论。 - 原始内容:对于XSS来说最好的解决办法就是转义!但做好转义并不容易,因为转义有很多种方式,而且很容易被开发人员忘掉……CSP(Content Security Policy)是防止XSS攻击的大招……目前github.com采用的方式,即禁止所有Inline JavaScript、eval,只加载指定域名下的JavaScript脚本,是目前最严格的一种CSP部署方式。