CSP 即 Content Security Policy(内容安全策略),是一种额外的安全层,用于帮助检测并减轻某些类型的攻击,特别是跨站脚本攻击(XSS)和数据注入攻击。以下从其工作原理、主要作用、设置方式、常用指令及关键字等方面进行详细介绍。
工作原理
CSP 的核心思想是服务器通过 HTTP 响应头或者 HTML 的 <meta>
标签向浏览器发送一个策略声明,该声明明确指定了页面可以从哪些源加载各种资源,如脚本、样式表、图片、字体等。当浏览器加载页面时,会根据这个策略来检查每个资源的来源,如果资源的来源不在允许的列表中,浏览器将拒绝加载该资源,从而防止恶意脚本的注入和执行。
主要作用
- 防止跨站脚本攻击(XSS):XSS 攻击通常是攻击者通过注入恶意脚本来窃取用户信息或执行其他恶意操作。CSP 可以限制页面只能从可信的源加载脚本,从而有效防止恶意脚本的注入和执行。
- 防止数据注入攻击:通过限制页面可以访问的资源和连接的服务器,CSP 可以减少数据注入攻击的风险,例如防止页面向恶意服务器发送敏感数据。
- 增强网站安全性:CSP 为网站提供了一层额外的安全防护,使得即使网站存在一些安全漏洞,攻击者也难以利用这些漏洞进行攻击。
设置方式
1. HTTP 响应头设置
服务器在响应 HTTP 请求时,可以通过设置 Content-Security-Policy
响应头来指定 CSP 策略。以下是一个响应头示例:
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com
2. HTML <meta>
标签设置
在 HTML 文件的 <head>
标签中,可以使用 <meta>
标签来设置 CSP 策略。示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://example.com">
<title>My Page</title>
</head>
<body>
<!-- 页面内容 -->
</body>
</html>
常用指令及关键字
常用指令
default-src
:通用指令,为其他未指定的资源类型提供默认的加载源规则。script-src
:指定允许加载脚本的源。style-src
:指定允许加载样式表的源。img-src
:指定允许加载图片的源。connect-src
:指定允许通过XMLHttpRequest
、WebSocket
和EventSource
连接的源。font-src
:指定允许加载字体的源。media-src
:指定允许加载音频和视频的源。frame-src
:指定允许嵌入<iframe>
的源。
常用关键字
'none'
:表示不允许从任何源加载资源。'self'
:表示当前源(协议、域名和端口都相同),即只允许从当前页面所在的源加载资源。'unsafe-inline'
:允许内联代码(如内联脚本和内联样式)的执行,但会带来安全风险,不建议在生产环境中使用。'unsafe-eval'
:允许使用eval()
等动态执行代码的方法,同样不建议在生产环境中使用。'nonce-<base64-value>'
:使用一次性的随机数(nonce
)来允许特定的内联代码执行。'sha256-<hash-value>'
:通过计算内联代码的sha256
哈希值,并将其添加到 CSP 规则中,允许特定的内联代码执行。*
:允许从任何网络源加载资源(注意*
没有用引号包裹)。data:
:允许使用data URI
形式的资源加载(注意data:
没有用引号包裹)。blob:
:用于表示二进制大对象(Binary Large Object),常用于处理文件和二进制数据,比如在 Web 应用中动态生成和操作文件。
通配符 *
表示允许从任何网络源加载资源,这里的网络源指的是基于传统的网络协议(如 HTTP、HTTPS)的域名和端口组合。 data:
、blob:
等是特殊的 URI 方案,它们有各自独特的用途和安全考虑,因此不会被通配符 *
所涵盖,需要单独指定才能允许使用。使用通配符会*
大大降低页面的安全性,因为它允许从任意域名加载资源,增加了被攻击的风险,所以一般不建议在生产环境中使用。
data URI
是一种特殊的 URI 格式,它允许将数据(如图片、脚本、样式等)直接嵌入到 URI 中,而不需要从外部服务器加载。其格式通常为 data:[<mediatype>][;base64],<data>
报告机制
可以通过 report-uri
或 report-to
指令设置 CSP 违规报告的地址。当发生 CSP 违规时,浏览器会向指定的地址发送一个 JSON 格式的报告,帮助开发者及时发现和处理安全问题。例如:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; report-uri /csp-report">
服务器端可以在 /csp-report
路径处理这些报告。