CSP策略配置后为什么还是被绕过执行了内联脚本?

俊娜的笔记 阅读 30

在做渗透测试时,给网站加了CSP策略禁止内联脚本,但测试人员用base64编码的dataURI依然能执行恶意脚本,这是怎么回事?

我的CSP配置是这样的:Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com,但测试用还是能弹窗。

已经尝试过加script-src 'unsafe-inline'黑名单,也用了nonce验证,但客户环境要求兼容旧版IE,这该怎么彻底堵住dataURI执行漏洞?

我来解答 赞 12 收藏
二维码
手机扫码查看
2 条解答
司空秀丽
问题出在data:协议没被明确禁用,CSP默认不会阻止它。省事的话直接加个 data: 到你的策略里:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://cdn.example.com; block-all-mixed-content; data: 'none'">


不过老版IE根本不支持CSP,建议用X-Content-Security-Policy兼容一下,但真想彻底堵住还是得放弃IE。
点赞 8
2026-02-01 16:19
UE丶超霞
这个问题我真踩过坑,血泪教训啊!CSP配置看似简单,但细节太多,稍不注意就被绕过去。

首先,你的配置里没有明确禁止data:协议,这是一大漏洞。攻击者可以用data:text/javascript;base64,...这种方式直接绕过。解决方法是在CSP里加一行:block-all-mixed-content,同时明确拒绝data:协议:script-src 'self' https://cdn.example.com; block-all-mixed-content;

其次,关于旧版IE兼容问题,确实是个麻烦事。IE11以下根本不支持CSP Level 2,nonce和hash都玩不转。建议用X-Content-Security-Policy头专门给IE用,内容和普通CSP一样,至少能挡住一部分攻击。

最后提醒一句,别迷信CSP能完全防住XSS,它只是多加一层防护。输入验证和输出编码才是根本,这两个做好了,CSP只是锦上添花。

给你一个完整配置参考:
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; block-all-mixed-content;
X-Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; block-all-mixed-content;


记住,安全这事永远是层层设防,不要把所有希望都寄托在一个策略上。
点赞 13
2026-01-30 11:22