CSP策略怎么设置?

wen 网络安全 1

本文目录导读:

CSP策略怎么设置?

  1. 常见 CSP 指令及含义
  2. 实战:一个相对安全且不误伤正常功能的 CSP 示例
  3. 如何调试与测试?
  4. 常见问题与注意事项

安全策略,Content Security Policy)是一种重要的安全机制,用于防止跨站脚本攻击(XSS)、数据注入攻击等,它通过 HTTP 响应头或 HTML 的 <meta> 标签来告诉浏览器哪些来源的资源是可信的。

以下是设置 CSP 的详细方法和常见策略配置:

通过 HTTP 响应头设置(推荐)

在服务器端(如 Nginx、Apache、Node.js 等)配置 HTTP 响应头,这是最常用且安全的方式。

示例:Nginx 配置

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.google.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; base-uri 'self';";

示例:Apache 配置

Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com;"

示例:Node.js (Express)

app.use((req, res, next) => {
  res.setHeader(
    'Content-Security-Policy',
    "default-src 'self'; font-src 'self' fonts.gstatic.com;"
  );
  next();
});

通过 HTML <meta> 标签设置(较简单,但限制较多)

在页面的 <head> 部分添加 <meta> 标签,注意:<meta> 方式不能完全覆盖 HTTP 头,且无法设置部分高级指令(如 report-uriframe-ancestors)。

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';">

常见 CSP 指令及含义

指令 作用 示例值
default-src 没有单独设置时的默认策略 'self'
script-src 允许加载 JavaScript 的源 'self' https://cdn.example.com
style-src 允许加载 CSS 的源 'self' 'unsafe-inline'
img-src 允许加载图片的源 'self' data: https://*
font-src 允许加载字体的源 'self' fonts.googleapis.com
connect-src 允许通过 Ajax/Fetch/WebSocket 连接的源 'self' https://api.myapp.com
frame-src / child-src 允许被嵌入的 <frame><iframe> 'self' https://player.vimeo.com
object-src 允许加载 <object>, <embed>, <applet> 的源 'none'(推荐禁止)
media-src 允许加载音频/视频的源 'self' https://media.example.com
base-uri 限制 <base> 标签的 URL 'self'
form-action 限制表单提交的 URL 'self' https://secure.example.com
frame-ancestors 限制当前页面可被哪些源嵌入(防点击劫持) 'none''self'
report-uri / report-to 当策略被违反时,向指定 URL 发送报告 /csp-violation-report-endpoint

特殊值说明

  • `'self':只允许同源(协议+域名+端口相同)。
  • `'none':禁止任何来源。
  • `'unsafe-inline':允许内联脚本/样式(有风险,尽量用哈希或 nonce 替代)。
  • `'unsafe-eval':允许使用 eval()setTimeout(string) 等(高风险)。
  • `'strict-dynamic':允许信任由已信任脚本动态加载的脚本(现代 CSP 推荐)。
  • https::允许所有 HTTPS 源。
  • data::允许 data: URI(如图片 base64)。

实战:一个相对安全且不误伤正常功能的 CSP 示例

Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'nonce-随机字符串' 'strict-dynamic' https://www.google-analytics.com;
  style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
  img-src 'self' data: https:;
  font-src 'self' https://fonts.gstatic.com;
  connect-src 'self' https://api.example.com wss://ws.example.com;
  object-src 'none';
  base-uri 'self';
  form-action 'self';
  frame-ancestors 'none';
  report-uri /csp-report;

说明:

  • noncehash 代替 'unsafe-inline' 可以更安全地允许内联脚本。
  • 禁止了 object-src(Flash、Java 插件等)。
  • 禁止了 frame-ancestors(防止被嵌入到其他网站)。
  • 设置了 report-uri 以收集违规报告。

如何调试与测试?

  1. 使用报告模式(只报告,不拦截): 在正式启用前,先使用 Content-Security-Policy-Report-Only 头,它只会收集违规报告,不会实际拦截资源,等确认无误后再改为 Content-Security-Policy

    Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report;
  2. 浏览器开发者工具: Chrome/Firefox 控制台会显示 CSP 违规的详细信息,包括被拦截的资源地址和策略指令。

  3. 在线工具: 使用 CSP Evaluator 检查策略的安全性。


常见问题与注意事项

  • 'unsafe-inline'noncehash:如果网站有大量内联脚本(如 <script>alert(1)</script>),直接禁用内联会导致功能崩溃,优先使用 nonce(每次请求生成随机值)或 hash的 SHA 哈希值)。
  • CDN 资源:如果使用了外部 CDN(如 jQuery、Bootstrap 的 CDN),必须在 script-srcstyle-src 中显式允许。
  • 第三方服务:Google Analytics、Facebook Pixel 等需要添加对应的域名到 script-srcimg-src 等指令。
  • WebSocket 连接:需要在 connect-src 中添加 wss://ws:// 源。
  • 报告接收:设置 report-uri 并实现一个服务器端端点来接收 JSON 格式的违规报告,有助于持续优化策略。

设置 CSP 的核心步骤:

  1. 分析网站需要加载哪些资源(脚本、样式、图片、字体、接口等)。
  2. 从严格策略开始default-src 'self',然后逐一放宽。
  3. Report-Only 模式测试,确保不破坏功能。
  4. 生产环境使用完整策略,并持续监控违规报告。

如果你能提供具体的网站需求(如使用哪些 CDN、框架、第三方服务),我可以帮你定制更精确的 CSP 策略。

抱歉,评论功能暂时关闭!