CSP 使用配置
Content-Security-Policy(CSP,内容安全策略) 是一种安全标准,用于防止跨站脚本攻击(XSS)、数据注入攻击和其他代码注入攻击。它通过定义哪些动态资源被允许加载,来增强网页的安全性。
CSP 的工作原理
CSP 通过HTTP响应头 Content-Security-Policy
来实现。它允许你指定哪些类型的资源可以从哪些源加载,从而限制页面上可以执行的脚本、样式、图片等资源。
常用的 CSP 指令
以下是一些常用的CSP指令及其作用:
-
default-src
:- 设置默认的源,适用于所有未特别指定的资源类型。
- 例如:
default-src 'self'
表示只允许加载同源的资源。
-
script-src
:- 控制脚本资源的加载。
- 例如:
script-src 'self' https://example.com
表示只允许加载同源和来自https://example.com
的脚本。
-
style-src
:- 控制样式资源的加载。
- 例如:
style-src 'self' 'unsafe-inline'
表示允许加载同源的样式和内联样式。
-
img-src
:- 控制图片资源的加载。
- 例如:
img-src 'self' https://images.example.com
表示只允许加载同源和来自https://images.example.com
的图片。
-
connect-src
:- 控制通过脚本发起的连接(如XMLHttpRequest、WebSocket)。
- 例如:
connect-src 'self' wss://example.com
表示只允许连接同源和wss://example.com
。
-
font-src
:- 控制字体资源的加载。
- 例如:
font-src 'self' https://fonts.example.com
表示只允许加载同源和来自https://fonts.example.com
的字体。
-
object-src
:- 控制插件(如Flash)的加载。
- 例如:
object-src 'none'
表示不允许加载任何插件。
-
frame-src
:- 控制iframe的加载。
- 例如:
frame-src 'self' https://example.com
表示只允许加载同源和来自https://example.com
的iframe。
-
media-src
:- 控制音频和视频资源的加载。
- 例如:
media-src 'self' https://media.example.com
表示只允许加载同源和来自https://media.example.com
的媒体资源。
-
child-src
:- 控制子资源的加载(如iframe、worker)。
- 例如:
child-src 'self' https://example.com
表示只允许加载同源和来自https://example.com
的子资源。
特殊值
'self'
:表示当前源。'unsafe-inline'
:允许内联脚本和样式。'unsafe-eval'
:允许使用eval()
和类似的动态代码执行。'none'
:表示不允许加载任何资源。
示例
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' 'unsafe-inline'; img-src 'self' https://images.example.com; connect-src 'self' wss://example.com;
这个示例表示:
- 默认情况下,只允许加载同源的资源。
- 脚本只能从同源和
https://example.com
加载。 - 样式可以从同源加载,并允许内联样式。
- 图片只能从同源和
https://images.example.com
加载。 - 通过脚本发起的连接只能连接同源和
wss://example.com
。
注意事项
- 逐步实施:建议逐步引入CSP,先在报告模式下测试(使用
Content-Security-Policy-Report-Only
),确保不会影响正常功能。 - 监控和调试:利用浏览器的开发者工具和CSP报告机制来监控和调试CSP策略。
- 兼容性:注意不同浏览器对CSP的支持情况。
通过合理配置CSP,可以显著提升网页的安全性,防止多种类型的注入攻击。