我已经设置了我的 CPS 并使用随机生成的随机数将我的所有脚本列入白名单。当前的 CSP 似乎适用于其他脚本,但它会阻止嵌入的 mailchimp 电子邮件订阅事件处理程序。 这是我收到的控制台错误消息:(仅报告策略)页面的设置将阻止执行事件处理程序(script-src-attr),因为它违反了以下指令:“script-src 'self''随机数-022e6ecce789b043b660daaaafa8814f' https://connect.facebook.net/en_US/fbevents.js https://www.googletagmanager.com/gtag/ https://s3.amazonaws.com/downloads.mailchimp.com/js/ mc-validate.js https://connect.facebook.net/”
被阻止的代码位置位于缩小后的 mailchimp mc-validate.js 内部
我应该使用什么指令来允许此 url 中的所有 js 在我的服务器上执行,而不使用“不安全内联”?
我尝试将“strict-dynamic”添加到 script-src 中,并使用随机生成的随机数将所有脚本列入白名单,但 mailchimp 事件处理程序仍然被阻止。到目前为止唯一有效的选择是将 script-src-attr 指令设置为“unsafe-inline”,我认为这不是一个安全的选择。
您在 Mailchimp 的
mc-validate.js
中遇到的问题与内容安全策略 (CSP) 与内联事件处理程序交互的方式有关。该错误消息表明 script-src-attr
指令正在阻止事件处理程序,这通常在使用内联 JavaScript(如 HTML 属性内的事件处理程序)时发生。
以下是解决方案的细分:
为什么需要
unsafe-inline
:脚本mc-validate.js
可能包含内联事件处理程序(例如,
onclick
、
onsubmit
等),并且CSP的
script-src-attr
默认情况下会阻止内联事件处理程序。
unsafe-inline
关键字在
script-src-attr
下使用时,允许内联事件处理程序,但这确实不安全,通常不鼓励这样做。
没有unsafe-inline
unsafe-inline
过于宽松,有一种更好的方法可以允许外部脚本运行而无需求助于它:
nonce-022e6ecce789b043b660daaaafa8814f
采取的步骤。然而,外部脚本中事件处理程序基于随机数的安全性通常比较棘手,因为内联事件处理程序有时会以需要特殊处理的方式嵌入到 HTML 或外部脚本中。
添加strict-dynamic
strict-dynamic
,理论上,它应该与
nonce
一起工作,以便在通过可信源动态加载脚本时允许执行脚本。但是,由于
strict-dynamic
仅适用于通过
src
属性加载的外部脚本,而不适用于内联事件处理程序,因此它无法直接解决脚本内事件处理程序的问题。
建议:要允许 mc-validate.js
脚本及其关联的事件处理程序在不使用
unsafe-inline
的情况下执行,请按照以下步骤操作:
确保所有外部脚本(包括 Mailchimp 的)都经过随机数批准:您应该确保 mc-validate.js
包含在正确应用的随机数中,如下所示:
<script src="https://s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js" nonce="022e6ecce789b043b660daaaafa8814f"></script>
将 script-src
和
script-src-attr
与随机数一起使用:像这样设置 CSP 标头:
Content-Security-Policy: script-src 'self' 'nonce-022e6ecce789b043b660daaaafa8814f' https://s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js; script-src-attr 'nonce-022e6ecce789b043b660daaaafa8814f';
这样,mc-validate.js
内部的内联脚本事件处理程序就可以安全地执行。
尝试谨慎使用unsafe-eval
Content-Security-Policy: script-src 'self' 'nonce-022e6ecce789b043b660daaaafa8814f' https://s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js 'unsafe-eval';
请谨慎使用 unsafe-eval
,因为它会引入漏洞,但有时某些动态生成代码的库(如
eval
)需要它。
测试:应用这些更改后,首先在开发环境中测试您的站点,以确保 Mailchimp 表单按预期工作并且不会发生 CSP 违规。