如何为脚本和样式标签添加随机数以避免 'unsafe inline' CSP header 字段?
How to add a nonce for script and style tags to avoid 'unsafe inline' CSP header field?
上下文描述
我正在使用 AWS Amplify 部署我的静态网页。
自定义安全性 header 通过配置文件 customHttp.yml (https://docs.aws.amazon.com/amplify/latest/userguide/custom-headers.htm)
在部署中应用
我将 customHttp.yml 文件包含在 .nuxtignore 文件中,以防止仅在自定义 headers 更改时触发 webpack 文件的重建。但是,这只能在本地起作用,在部署过程中不能在服务器端起作用。
问题描述
AWS Amplify 在部署过程中不使用 .nuxtignore 文件。因此每次都会重建 webpack 文件,导致我需要在 CSP header 字段 script-src 和 style-src 中包含不同的哈希值。但是由于触发重建以将修改应用到 customHttp.yml 会导致 jetpack 文件具有新的 has 值,所以我们永远不知道预先的正确值。
解决问题的建议
随机数(如果是静态的)可以解决我的用例。例如,通过在 nuxt.config.js 文件中定义随机数。通过在 webpack 重建中包含随机数,我将能够在 CSP header 字段中引用静态随机数,因为值不会改变。
例如 - nuxt.config.js:
生成:{
script-nonce: 'nonce-457bb2Bb06E44Ab5aa9996Ed1a34b26F',
style-nonce: 'nonce-[ ADD A VALUE HERE ]'
}
我意识到内容安全策略规范在每次服务器传输 CSP-policy 时都需要一个唯一的随机数值,但是对于这个用例,静态随机数将是我的首选建议。
使用“静态随机数”与 'unsafe-inline'
用法相同。你只能愚弄一些在线 CSP 测试工具,他们无法识别你的 'nonce-value'
是静态的。
经典 XSS 是指可以插入和执行类似 <script>alert('XSS')</script>
的代码。没有 'unsafe-inline'
这样的内联脚本将被阻止。
但是使用“静态随机数”攻击者只需注入 <script nonce="static_nonce">alert('XSS')</script>
,因此您的漏洞与允许 'unsafe-inline'
时完全相同。
虽然使用动态 nonce,攻击者可以看到当前的 nonce,但无法预测下一个。所以他不知道使用哪个nonce值,因为他的XSS只有在页面重新加载后才会被注入。
请参阅 With CSP enabled vis amplify.yml results in Errors #612,也许您会在那里找到一些线索(link Lambda@Edge 函数和底部的 Amazon CloudFront)。
上下文描述 我正在使用 AWS Amplify 部署我的静态网页。
自定义安全性 header 通过配置文件 customHttp.yml (https://docs.aws.amazon.com/amplify/latest/userguide/custom-headers.htm)
在部署中应用我将 customHttp.yml 文件包含在 .nuxtignore 文件中,以防止仅在自定义 headers 更改时触发 webpack 文件的重建。但是,这只能在本地起作用,在部署过程中不能在服务器端起作用。
问题描述 AWS Amplify 在部署过程中不使用 .nuxtignore 文件。因此每次都会重建 webpack 文件,导致我需要在 CSP header 字段 script-src 和 style-src 中包含不同的哈希值。但是由于触发重建以将修改应用到 customHttp.yml 会导致 jetpack 文件具有新的 has 值,所以我们永远不知道预先的正确值。
解决问题的建议 随机数(如果是静态的)可以解决我的用例。例如,通过在 nuxt.config.js 文件中定义随机数。通过在 webpack 重建中包含随机数,我将能够在 CSP header 字段中引用静态随机数,因为值不会改变。
例如 - nuxt.config.js:
生成:{ script-nonce: 'nonce-457bb2Bb06E44Ab5aa9996Ed1a34b26F', style-nonce: 'nonce-[ ADD A VALUE HERE ]' }
我意识到内容安全策略规范在每次服务器传输 CSP-policy 时都需要一个唯一的随机数值,但是对于这个用例,静态随机数将是我的首选建议。
使用“静态随机数”与 'unsafe-inline'
用法相同。你只能愚弄一些在线 CSP 测试工具,他们无法识别你的 'nonce-value'
是静态的。
经典 XSS 是指可以插入和执行类似 <script>alert('XSS')</script>
的代码。没有 'unsafe-inline'
这样的内联脚本将被阻止。
但是使用“静态随机数”攻击者只需注入 <script nonce="static_nonce">alert('XSS')</script>
,因此您的漏洞与允许 'unsafe-inline'
时完全相同。
虽然使用动态 nonce,攻击者可以看到当前的 nonce,但无法预测下一个。所以他不知道使用哪个nonce值,因为他的XSS只有在页面重新加载后才会被注入。
请参阅 With CSP enabled vis amplify.yml results in Errors #612,也许您会在那里找到一些线索(link Lambda@Edge 函数和底部的 Amazon CloudFront)。