CSP 怎么配置才能产生实际价值?nonce、hash 与 Report-Only 分别是什么?

先理解原理和示例,再练习完整口述与追问。

CSP 限制资源与执行来源;从报告模式验证;nonce 每次响应随机生成;hash 对内容匹配;不能替代转义与鉴权。

Content-Security-Policy 由服务端响应头等方式声明浏览器允许加载或执行的资源范围。例如 default-src 设置回退策略,script-src、style-src、img-src、connect-src 分别控制脚本、样式、图片和连接,object-src 'none' 常用于关闭插件内容,base-uri 限制 base,frame-ancestors 限制谁可以嵌入当前页面。connect-src 也会影响 fetch、WebSocket 和部分上报请求,因此要按真实依赖配置。

允许内联脚本时,可以为每次 HTML 响应生成不可预测且不重复复用的 nonce,并同时放到 CSP 与可信脚本标签上;不能把固定字符串长期当 nonce,也不能给攻击者可控脚本自动附上它。hash 则针对脚本或样式的准确字节内容,内容变化需要更新摘要,适合固定的可信片段。随意加 unsafe-inline、unsafe-eval 或过宽的域名会削弱策略。

落地时先用 Content-Security-Policy-Report-Only 收集违规,识别真实依赖并收敛白名单,再切换为阻止模式,报告端要采样并过滤敏感信息。CSP 是纵深防御,仍需上下文转义、可靠的 HTML 清洗、依赖治理和服务端权限校验;策略也不会自动阻止所有逻辑漏洞。不同指令能否放 meta、浏览器支持和报告能力都应单独核实。

参考:MDN CSP 实施指南。

每次 HTML 响应生成新的随机 nonce,同时放进 CSP script-src 与允许的 script 标签。攻击者插入的脚本没有该 nonce 就不应获得执行权。上线先 Report-Only 看哪些真实依赖被拦,再逐项确认、收紧并正式阻止;不把收集到的任意域名都加进白名单。

nonce 固定长期复用会削弱保护。frame-ancestors、base-uri 等指令不是所有都继承 default-src,必须按指令定义配置。

Content-Security-Policy 由服务端响应头等方式声明浏览器允许加载或执行的资源范围。例如 default-src 设置回退策略,script-src、style-src、img-src、connect-src 分别控制脚本、样式、图片和连接,object-src 'none' 常用于关闭插件内容,base-uri 限制 base,frame-ancestors 限制谁可以嵌入当前页面。connect-src 也会影响 fetch、WebSocket 和部分上报请求,因此要按真实依赖配置。