Content Security Policy 内容安全策略

CSP 是什么

CSP(Content Security Policy,内容安全策略)是一个 Web 安全标准,用于防止跨站脚本攻击(XSS)、数据注入和其他恶意攻击。通过指定哪些资源是允许加载的,CSP 能够帮助减少这些攻击的风险。

CSP 是通过 HTTP 头(Content-Security-Policy)或 HTML 元素(<meta> 标签)进行配置的。它允许网站控制哪些外部资源(如脚本、样式表、图片等)能够被加载,哪些是不允许的。

CSP 配置基本原理

CSP 通过定义一组规则来指定可以加载的资源源。例如,你可以限制只有来自你自己域名的脚本能执行,禁止加载来自其他不安全源的脚本。这样,即使攻击者注入恶意代码,CSP 也能阻止它执行。

示例:

# Content-Security-Policy: <规则> <指令>;
Content-Security-Policy: default-src 'self';

这个 CSP 规则指定只允许加载同源('self')的资源,其他外部资源(比如来自第三方域的脚本或图片)都将被阻止。

CSP 规则

  • default-src: 指定允许加载的默认资源源(如 JS、CSS、图片等)。
  • script-src: 限制加载脚本的源。
  • style-src: 限制加载样式表的源。
  • img-src: 限制图片的来源。
  • font-src: 限制字体的来源。
  • connect-src: 限制通过 XMLHttpRequest、WebSocket 等进行的连接来源。
  • child-src: 限制嵌套资源(如 iframe)的来源。

CSP 指令

  • self:允许加载来自同源(即当前域名)资源。
  • none:不允许加载任何资源。
  • unsafe-inline:允许内联脚本和内联样式,但这可能引起 XSS 风险。
  • unsafe-eval:允许使用 eval() 函数,但这也可能增加攻击风险。
  • strict-dynamic:允许动态加载的资源。

配置 CSP 的方式

CSP 可以通过两种方式配置:

  1. 通过 HTTP 头配置 CSP

最常见的做法是通过 HTTP 响应头配置 CSP。这是推荐的方式,因为它可以在服务器层面控制,且不易被绕过。

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com;
  1. 通过 <meta> 标签配置 CSP

你还可以在 HTML 中使用 <meta> 标签来配置 CSP,这通常用于对 CSP 进行局部控制,但在安全性上稍逊色:

<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'self'; script-src 'self' https://trusted-cdn.com;"
/>

示例

> GET / HTTP/1.1
> Host: www.oa.com
>
< HTTP/1.1 200 OK
< Content-Type: text/html
# www.oa.com 回应 Content-Security-Policy 头表示允许执行 www.alvinhtml.com 下的 script 和 Ajax
< Content-Security-Policy: script-src www.alvinhtml.com; content-src www.alvinhtml.com;
<
<!DOCTYPE html><html><head><script src="http://www.alvinhtml.com/aaa.js" /> ...

# alvinhtml.com 回应 Access-Control-Allow-Origin 头表示允许 oa.com 跨域访问自己的资源
> GET / HTTP/1.1
> Host: www.alvinhtml.com
>
< HTTP/1.1 200 OK
< Content-Type: application/json;
< Access-Control-Allow-Origin: *.oa.com

总结

  • CSP 允许你控制哪些资源能被加载,增强网站的安全性。
  • 可以通过 HTTP 头或 <meta> 标签配置 CSP。
  • 要小心使用 'unsafe-inline' 和 'unsafe-eval',因为它们增加了攻击的风险。
  • 推荐逐步配置 CSP,以避免不必要的资源加载阻止。

CSP 是防止跨站脚本攻击(XSS)和其他恶意脚本执行的重要工具,配置得当能显著提高网站的安全性。

Keywords

Content Security Policy 内容安全策略 Content-Security-Policy