Nginx CSP 配置说明
2024年8月17日...大约 3 分钟
Nginx CSP(Content-Security-Policy) 配置说明
Content-Security-Policy (CSP)
是一种 web 安全机制,用于防止跨站脚本 (XSS)、数据注入等攻击。通过配置 CSP,您可以限制网页上哪些资源可以被加载以及如何加载。
CSP 支持的策略
CSP 支持多种策略,常用的包括以下几种:
default-src
:设置默认的资源加载策略,如果没有为特定类型的资源指定策略,默认使用default-src
。
- 例子:
default-src 'self' https://example.com;
script-src
:限制 JavaScript 的加载来源。
- 例子:
script-src 'self' 'unsafe-inline' https://scripts.example.com;
style-src
:限制 CSS 样式的加载来源。
- 例子:
style-src 'self' 'unsafe-inline' https://styles.example.com;
img-src
:限制图像的加载来源。
- 例子:
img-src 'self' https://images.example.com data:;
font-src
:限制字体的加载来源。
- 例子:
font-src 'self' https://fonts.example.com;
connect-src
:限制通过 fetch、XHR、WebSocket 等方法进行的连接的目标。
- 例子:
connect-src 'self' https://api.example.com;
media-src
:限制音频和视频的加载来源。
- 例子:
media-src 'self' https://media.example.com;
object-src
:限制<object>
、<embed>
、<applet>
元素的加载来源。
- 例子:
object-src 'none';
(禁用所有外部对象)
frame-src
:限制内嵌框架(如<iframe>
)的加载来源。
- 例子:
frame-src 'self' https://frames.example.com;
worker-src
:限制 Web Workers、Shared Workers 和 Service Workers 的来源。
- 例子:
worker-src 'self';
child-src
:限制可以嵌入的内容,如<frame>
、<iframe>
、Web Workers。
- 例子:
child-src 'self' https://child.example.com;
frame-ancestors
:指定当前页面可以嵌入到哪些页面(使用<frame>
或<iframe>
)。
- 例子:
frame-ancestors 'self' https://parent.example.com;
form-action
:限制表单的提交地址。
- 例子:
form-action 'self';
base-uri
:限制用于<base>
元素的 URL。
- 例子:
base-uri 'self';
manifest-src
:限制可以加载 Web 应用清单 (manifest.json
) 的来源。
- 例子:
manifest-src 'self';
prefetch-src
:限制<link rel="prefetch">
和<link rel="dns-prefetch">
的加载来源。
- 例子:
prefetch-src 'self';
navigate-to
:限制可以导航到哪些 URI。
- 例子:
navigate-to 'self';
upgrade-insecure-requests
:强制将 HTTP 请求升级为 HTTPS 请求。
- 例子:
upgrade-insecure-requests;
block-all-mixed-content
:阻止页面加载任何混合内容(即 HTTPS 页面加载 HTTP 资源)。
- 例子:
block-all-mixed-content;
配置策略
CSP 可以通过 HTTP 头或 <meta>
标签配置。最常见的方式是通过 HTTP 头的 Content-Security-Policy
来设置。
HTTP 头配置示例
add_header Content-Security-Policy "
default-src 'self';
script-src 'self' 'unsafe-inline' https://cdn.example.com;
style-src 'self' 'unsafe-inline';
img-src 'self' https://images.example.com data:;
font-src 'self' https://fonts.example.com;
connect-src 'self' https://api.example.com;
object-src 'none';
frame-ancestors 'self';
upgrade-insecure-requests;
";
<meta>
标签配置示例
<meta http-equiv="Content-Security-Policy" content="
default-src 'self';
script-src 'self' 'unsafe-inline' https://cdn.example.com;
style-src 'self' 'unsafe-inline';
img-src 'self' https://images.example.com data:;
font-src 'self' https://fonts.example.com;
connect-src 'self' https://api.example.com;
object-src 'none';
frame-ancestors 'self';
upgrade-insecure-requests;
">
未配置的策略
- 如果某个特定的策略(如 script-src、style-src)未被显式配置,CSP 会回退到 default-src 的配置。
- 如果 default-src 也未配置,则默认不允许任何来源。
推荐配置策略
- 最小权限原则:尽量限制每个资源的加载来源,遵循最小权限原则。
- 逐步放宽:从严格的配置开始,逐步放宽策略,以找到平衡点。
- 监控与报告:使用 Content-Security-Policy-Report-Only 头进行测试和监控,以确定哪些资源被阻止,然后进行调整。
通过合理配置 CSP,可以有效地防止多种安全威胁,同时确保页面功能正常。
贡献者
changelichangyangccm@163.com