鲁斯前端布鲁斯前端

文章中英模式

布鲁斯前端面试题目 - Content Security Policy

深入解析Content Security Policy (CSP)的原理、配置和最佳实践。了解如何通过CSP防止XSS攻击和保护网站安全。

影片縮圖

懒得看文章?那就来看视频吧

内容安全政策(CSP)是什么?

内容安全政策(CSP)就像网站的保安系统,告诉浏览器哪些资源可以加载,哪些不行。它主要用来防止XSS攻击(有人在你网站注入恶意程序代码)。

CSP运作原理:

  网站                         浏览器
    |                           |
    |-- 设定CSP规则 ---------->  |
    |                           |-- 检查资源是否符合规则
    |<-- 只加载符合规则的资源 --   |
    |                           |
    |<-- 阻挡不符合规则的资源 --   |

简单来说,你可以告诉浏览器:「只执行来自我自己网站的代码,拒绝其他来源」。

<!-- 只允许自己网站的资源 -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

💡 CSP的主要目标:

  • 1. 防止XSS攻击
  • 2. 监控并报告安全违规
  • 3. 控制资源加载来源
  • 4. 提升网站整体安全性

CSP如何工作?

CSP通过HTTP头部或HTML meta标签实现,告诉浏览器哪些资源可以加载和执行。浏览器随后会强制执行这些政策,阻止加载不符合政策的资源。

通过HTTP头部实现

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; img-src *

通过HTML meta标签实现

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

CSP指令与来源值

常用CSP指令

指令说明
default-src所有资源的默认策略
script-srcJavaScript来源白名单
style-srcCSS样式来源白名单
img-src图片来源白名单
connect-src限制可通过XHR、WebSockets等连接的来源
font-src字体来源白名单
frame-srciframe来源白名单
media-src音频和视频来源白名单
object-srcFlash和其他插件来源白名单
report-uri违规报告发送的URL

常用来源值

来源值说明
'self'只允许来自同一来源的资源
'none'不允许任何来源
'unsafe-inline'允许内联资源(如内联<script>标签)
'unsafe-eval'允许使用eval()和类似功能
https:只允许HTTPS协议的资源
example.com允许特定域名的资源
*.example.com允许特定域名及其子域名的资源
*允许任何来源(不推荐使用)

CSP配置实例

基础安全配置

// 只允許從當前域名加載所有資源
Content-Security-Policy: default-src 'self'

混合内容配置

// 配置多種資源類型
Content-Security-Policy: default-src 'self';
                         script-src 'self' https://cdn.jsdelivr.net;
                         style-src 'self' https://fonts.googleapis.com;
                         img-src 'self' https://images.unsplash.com;
                         font-src 'self' https://fonts.gstatic.com;
                         connect-src 'self' https://api.example.com;
                         frame-src https://www.youtube.com

报告模式

// 僅報告違規,不阻止內容加載
Content-Security-Policy-Report-Only: default-src 'self';
                                    report-uri https://example.com/csp-reports

严格配置(适合高安全性应用)

// 嚴格限制所有資源來源
Content-Security-Policy: default-src 'none';
                         script-src 'self';
                         style-src 'self';
                         img-src 'self';
                         font-src 'self';
                         connect-src 'self';
                         form-action 'self';
                         frame-ancestors 'none';
                         base-uri 'self';
                         block-all-mixed-content;
                         upgrade-insecure-requests

内联脚本的处理

CSP默认会阻止内联脚本,但许多应用依赖于内联脚本。

解决方案:

使用 nonce 属性:为每个内联脚本添加随机生成的nonce值

<!-- 使用nonce值 -->
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-2726c7f26c'">
<script nonce="2726c7f26c">
  alert('Hello, world!');
</script>

🔥 常见面试题目

(一) 什么是内容安全政策(CSP)? 它解决了哪些安全问题?

解答:内容安全政策(CSP)就像网站的安全守门员,它告诉浏览器哪些资源可以加载,哪些必须拒绝。简单说,它限制了JavaScript、CSS和图片等资源的来源。

CSP工作原理:

网站设定规则 → 浏览器执行规则 → 阻挡不符合的资源

// 设定CSP的两种方式
// 1. HTTP头部
Content-Security-Policy: default-src 'self'

// 2. HTML meta标签
<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'">

CSP主要解决四大安全问题:

    安全问题CSP解决方式简单例子
    XSS攻击阻止恶意脚本执行script-src 'self'
    点击劫持控制页面是否可被嵌入框架frame-ancestors 'none'
    数据窃取限制可连接的API来源connect-src 'self' api.example.com

即使网站有安全漏洞,CSP也能作为最后防线,限制攻击者能做的事情,大幅降低安全风险。