Nginx 设置 Content-Security-Policy (CSP)
要在 Nginx 中设置 Content-Security-Policy (CSP),可以在 Nginx 的配置文件中添加以下代码段:
add_header Content-Security-Policy "directive1; directive2; directive3";
其中,directive1
、directive2
和 directive3
是 CSP 指令,它们可以是以下任意一种或多种:
default-src
: 指定默认的来源,如果其他指令没有覆盖,则使用该指令。script-src
: 指定可以包含在页面中的脚本的来源。style-src
: 指定可以包含在页面中的样式表的来源。img-src
: 指定可以包含在页面中的图像的来源。connect-src
: 指定可以从页面中进行连接的来源,例如 WebSocket、XHR、Fetch 和 EventSource 。font-src
: 指定可以包含在页面中的字体的来源。object-src
: 指定可以包含在页面中的插件的来源,例如 Flash、Java 和 Silverlight。media-src
: 指定可以包含在页面中的音频和视频的来源。frame-src
: 指定可以包含在页面中的框架的来源。sandbox
: 指定使用沙盒模式的特定来源。
可以根据需要添加或删除 CSP 指令。例如,以下代码段将只允许加载来自本站和 blog.yangyuhong.com.cn
的脚本和样式表:
add_header Content-Security-Policy "default-src 'self' blog.yangyuhong.com.cn 'unsafe-inline' 'unsafe-eval' blob: data: ;";
其中'unsafe-inline'
和'unsafe-eval'
是CSP(Content Security Policy)中的关键词,用于指示浏览器是否允许执行内联脚本和动态脚本。
'unsafe-inline'
指示浏览器允许在HTML页面中直接嵌入脚本代码,例如<script>alert('Hello World!');</script>
,这种方式被认为是不安全的,因为它容易受到XSS攻击。'unsafe-eval'
指示浏览器允许使用eval()
函数或函数构造器(Function()
)来执行动态脚本,例如eval('alert("Hello World!");')
,这种方式也被认为是不安全的,因为它容易受到代码注入攻击。
为了提高网站的安全性,CSP可以限制哪些脚本可以被执行,包括内联脚本、动态脚本、外部脚本等,从而减少XSS攻击和代码注入攻击的风险。在CSP中,可以使用'unsafe-inline'
和'unsafe-eval'
以外的其他关键词,例如'self'
、'strict-dynamic'
、'nonce'
、'hash'
等,来指定可信的脚本来源和脚本内容。
当nginx服务器配置了CSP,并且限制了内联脚本和动态脚本的执行时,如果页面中包含了内联脚本或动态脚本,浏览器就会拒绝执行这些脚本,并在控制台输出类似于Refused to execute inline script because it violates the following Content Security Policy directive
的错误信息。此时,可以通过放宽CSP策略,允许执行内联脚本和动态脚本,来解决这个问题,但这也会增加网站的安全风险。