内容安全政策Content Security Policy, CSP
用来定义页面可以加载哪些资源,减少 XSS 的发生
使用 CSP
使用 CSP
需要添加类似的 Header
Content-Security-Policy: default-src 'self'
说明:
default-src
是 CSP
指令,多个指令之间用英文分号分割'self'
是指令值,多个指令值用英文空格分割,值内容说明'self'
允许加载相同源的内容'*'
允许加载任何内容'none'
不允许加载任何内容
指令
指令 | 指令值示例 | 说明 |
---|
default-src | 'self' cnd.xiexianbin.cn | 定义针对所有类型(js、image、css、web font,ajax 请求,iframe,多媒体等)资源的默认加载策略,某类型资源如果没有单独定义策略,就使用默认的。 |
script-src | 'self' js.xiexianbin.cn | 定义针对 JavaScript 的加载策略。 |
style-src | 'self' css.xiexianbin.cn | 定义针对样式的加载策略。 |
img-src | 'self' img.xiexianbin.cn | 定义针对图片的加载策略。 |
connect-src | 'self' | 针对 Ajax、WebSocket 等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为 400 的响应。 |
font-src | font.xiexianbin.cn | 针对 WebFont 的加载策略。 |
object-src | 'self' | 针对 <object>、<embed> 或 <applet> 等标签引入的 flash 等插件的加载策略。 |
media-src | media.xiexianbin.cn | 针对 <audio> 或 <video> 等标签引入的 HTML 多媒体的加载策略。 |
frame-src | 'self' | 针对 frame 的加载策略。 |
sandbox | allow-forms | 对请求的资源启用 sandbox(类似于 iframe 的 sandbox 属性)。 |
report-uri | /report-uri | 告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。特别的:如果想让浏览器只汇报日志,不阻止任何内容,可以改用 Content-Security-Policy-Report-Only 头。 |
指令值
指令值可以由下面这些内容组成:
指令值 | 指令示例 | 说明 |
---|
| img-src | 允许任何内容。 |
'none' | img-src 'none' | 不允许任何内容。 |
'self' | img-src 'self' | 允许来自相同来源的内容(相同的协议、域名和端口)。 |
data: | img-src data: | 允许 data: 协议(如 base64 编码的图片)。 |
www.xiexianbin.cn | img-src img.xiexianbin.cn | 允许加载指定域名的资源。 |
.xiexianbin.cn | img-src .xiexianbin.cn | 允许加载 xiexianbin.cn 任何子域的资源。 |
https://img.com | img-src https://img.com | 允许加载 img.com 的 https 资源(协议需匹配)。 |
https: | img-src https: | 允许加载 https 资源。 |
'unsafe-inline' | script-src 'unsafe-inline' | 允许加载 inline 资源(例如常见的 style 属性,onclick,inline js 和 inline css 等等)。 |
'unsafe-eval' | script-src 'unsafe-eval' | 允许加载动态 js 代码,例如 eval()。 |
HTML 配置
- HTML 配置
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"/>
作用是告诉浏览器访问 http 时强制跳转到 https - HTML 配置示例
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
Nginx 配置
- nginx 实现类似的功能:
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";