CSP 内容安全策略
CSP(Content-Security-Policy)内容安全策略(简称CSP),官方定义:这是一个补充的一层机制,在保障系统完整性的同时有效防止跨站脚本攻击(XSS)和数据注入攻击等特定类型的安全威胁。
配置方法:
1. 后端配置网络服务器返回Content-Security-Policy头部
2. 前端通过标签进行配置
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
AI写代码
CSP使用目的
在XSS攻击防护方面:CSP的主要功能是统计并报告XSS攻击事件。具体而言,在配置浏览器认可的可执行脚本的有效来源时(即仅允许从已预先确认的安全网站中加载相关的脚本文件),就可以有效避免其他潜在的安全威胁如内联脚本及网页上的事件处理代码所可能带来的风险。
数据注入攻击方面:可指定所有内容必须通过HTTPS加载。
策略制定
配置相关策略,可以控制浏览器为该页面获取的资源。
Content-Security-Policy: default-src | script-src | style-src | img-src …
script-src:脚本文件源style-src:样式表源img-src:图片文件源media-src:媒体文件源(包括音频和视频)font-src:字体文件源object-src:插件文件(如Flash)child-src:框架文件frame-ancestors$:嵌入资源源connect-src$:HTTP 连接源(通过XHR、WebSockets、EventSource等)- **worker-src `:工作脚本文件
- **manifest-src `: manifest 文件源
常用安全策略方案:
1. 内容同源
Content-Security-Policy: default-src 'self'
AI写代码
2. 信任指定域资源
Content-Security-Policy: default-src 'self' *.example.com
AI写代码
3. 信任所有图片源,限制富媒体资源
Content-Security-Policy: default-src 'selc'; img-src *; media-src media1.com media2.com; srcipt-src *.example.com
AI写代码
默认的,各类资源允许从文档所在源获取,但以下内容除外:
- 图片资源不受任何限制
- 富媒体资源只能来自media1.com和media2.com,并且此类网站及其子域除外
- 可运行脚本只能包含*.example.com的文件
- 如果未设置script-src,则所有JavaScript代码将仅由原始服务器提供
4. 通过HTTPS加载
Content-Security-Policy: default-src https://some.trusted.com/
AI写代码
测试策略
Content-Security-Policy in Report Mode, and CSP policy is not mandatory, but any violation will be reported to the designated URI.
CSummand和CSP-RO是两种用于管理网站安全策略的机制。其中,CSP-Summand不仅规定了安全策略,还强制执行这些策略;而CSP-RO则仅用于生成并提交相关报告,并不具有强制执行功能。生成并提交违规报告
配置发送违规报告需设置相关参数指令并指定至少一个URI地址:
Content-Security-Policy: default-src 'self'; report-uri https://report.catch.com/collector.cpi
AI写代码
然后在服务器设置接收。
案例使用说明
假设存在一个 https://example.com/index.html 的网页实例,在实施 CSP 策略时仅限于 cdn.example.com 提供的样式表资源。
Content-Security-Policy: default-src 'none'; style-src cdn.example.com; report-uri /_/report-collect
AI写代码
index.html代码如下:
<!DOCTYPE html>
<html><head><link rel="stylesheet" href="css/style.css"></head><body>...</body>
</html>
AI写代码
因CSP配置问题,在线所有total link标签的CSS资源均无法正常加载,并触发了一个违规报告并将其收集到指定位置https://example.com/_/report-collect。
{"report-collect": {"document-uri":https://example.com/index.html, // 发生违规行为的文档的URI"referrer": "",// 违规发生处的文档引用地址"blocked-uri": "https://example.com/css/style.css", // 被CSP阻止的资源"violated-directive": "style-src cdn.example.com",// 违反的策略名称"original-policy": "default-src 'none'; style-src cdn.example.com;report-uri /_/report-collect", // 原始策略}
}
AI写代码
