SEO 百科
CSP
本页目录
CSP
CSP(内容安全策略)是网站发给浏览器的一组指令,用来限定页面能加载哪些资源、能执行哪些代码[1]。它的主要用途是给跨站脚本攻击加一层兜底,主防对象是脚本[1]。配得对,攻击者注入的代码跑不起来;配得不对,自己的脚本先被拦掉。
它防住的对象
W3C 说,CSP 是让开发者锁定自己应用的一套工具,用来降低内容注入类漏洞的风险,跨站脚本是其中一种[3]。同一条还写明,CSP 不是防注入的第一道防线,而是纵深防御[3]。
MDN 补充了另外两个用途:防点击劫持,以及推动页面走 HTTPS[1]。
指令与写法
策略由若干条指令组成,指令之间用分号隔开,每条指令有一个名字和一个值[1]。
Content-Security-Policy: default-src 'self'; img-src 'self' example.com
上例里 default-src 给所有资源定了兜底规则,img-src 单独放宽图片的来源[2]。
控制脚本的推荐做法是严格 CSP:用一次性随机数或者散列来放行脚本[1]。用随机数时,服务器每次响应生成一个新值,同时写进标头与页面的 <script> 标签,两边一致才执行[1]。
Content-Security-Policy: script-src 'nonce-416d1177-4d12-4e3b-b7c9-f6c409789fb8'; object-src 'none'; base-uri 'none'
页面里对应的写法是 <script nonce="416d1177-...">,nonce 属性与标头里的值必须一致[1]。
配错会拦掉自己的脚本
CSP 一旦写上 default-src 或 script-src,内联脚本默认就不执行了[1]。内联 <script>、像 onclick 这样的事件处理属性、javascript: 地址,全在禁止之列[1]。
出问题的常见形态是页面里原本就有一段内联脚本,或者某个第三方脚本自己又插了新脚本。前者可以把代码搬进外部文件,后者要用 strict-dynamic 让信任沿着脚本链传下去[1]。
上线前先跑 Report-Only。这个模式只报告违规,不真的拦,等于先看一遍会发生什么[2]。
Content-Security-Policy-Report-Only: default-src 'self'
与抓取和收录的关系
CSP 是响应标头,不改页面源码,也不直接改收录规则。它影响的是渲染时哪些资源能进来。
脚本被 CSP 拦下之后,由脚本生成的内容在渲染结果里就缺一块。搜索引擎渲染页面时要加载并执行脚本,脚本取不到,后面的内容也就无从生成。页面源文档正常,渲染结果却少一块,两边对不上。
这一点和「混合内容」是同一类问题的两个源头:一个拦的是不安全的地址,一个拦的是不在白名单里的地址。
常见误用
- 照抄一份严格策略直接上生产。存量内联脚本会被一起拦掉,上线前先跑 Report-Only。
- 为了不改造存量代码,直接加上
unsafe-inline。MDN 直接提醒,这一项会破坏设置 CSP 的大部分意义[2]。 - 把
<meta>当成完整方案。MDN 说明,用<meta>写法并不支持全部 CSP 特性[1];Web Almanac 把这类用错位置的策略单列成节[4]。 - 以为配了 CSP 就不用管输入处理。W3C 明确说 CSP 是纵深防御,不替代输入校验与输出编码[3]。
附录
参见
参考资料
官方(境外)
- 《内容安全策略(CSP)》,MDN Web 文档。
- 《Content-Security-Policy (CSP)》,MDN Web 文档。
- 《Content Security Policy Level 3》,W3C。
第三方
- 《Security》,HTTP Archive《Web Almanac 2025》,2026-01-15。
外部链接
无。