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]。

附录

参见

参考资料

官方(境外)

  1. 《内容安全策略(CSP)》,MDN Web 文档。
  2. 《Content-Security-Policy (CSP)》,MDN Web 文档。
  3. 《Content Security Policy Level 3》,W3C。

第三方

  1. 《Security》,HTTP Archive《Web Almanac 2025》,2026-01-15。

外部链接

无。