CodeIgniter 4.x中Content-Security-Policy及nonce值使用相关问题
CSP配置相关问题解答
内联资源nonce生成异常、告警规则不一致的原因
- CodeIgniter(以下简称CI)的CSP nonce自动生成与替换逻辑,仅覆盖框架原生渲染流程以及官方适配组件:debug bar属于CI官方自带的调试组件,已经完成CSP适配,因此会自动为其输出的内联CSS、JS添加符合要求的nonce。而kint属于第三方调试工具,默认未接入CI的CSP钩子,因此不会自动为它的内联资源生成并添加nonce。
- kint未触发浏览器CSP告警的常见原因有两个:一是你的CSP规则中对kint资源做了
unsafe-inline豁免、或者配置了kint静态资源域名的白名单;二是kint的输出时机晚于CI视图渲染的CSP校验前置逻辑,且其内联资源的哈希值被意外加入了CSP白名单。 - 欢迎页的
{csp-style-nonce}/{csp-script-nonce}占位符未生效,是因为你没有将占位符正确填写到对应内联标签的nonce属性中:正确用法是<style nonce="{csp-style-nonce}">、<script nonce="{csp-script-nonce}">,只有符合这个格式的占位符,CI才会在视图渲染时自动替换为当前请求生成的有效nonce值,未正确配置的内联资源就会触发浏览器告警。
浏览器获取校验nonce的逻辑
浏览器用于校验的nonce值,全部来自HTTP响应头的Content-Security-Policy字段:
例如响应头携带Content-Security-Policy: script-src 'nonce-2726c7f26c' 'nonce-3837d8g37d'; style-src 'nonce-1615b6e15b'时,浏览器会允许带有nonce="2726c7f26c"/nonce="3837d8g37d"的内联脚本执行,以及带有nonce="1615b6e15b"的内联样式生效,其他未携带对应nonce的内联资源都会被拦截并抛出告警。
CI CSP特性与多nonce配置方案
- 使用CI原生
{csp-style-nonce}/{csp-script-nonce}特性时,如果你没有自定义修改CSP响应头,CI的CSP类会自动将生成的nonce值添加到对应响应头规则中,不需要额外手动配置;但如果你手动覆写了Content-Security-Policy响应头,就需要手动将生成的nonce值拼接到对应的script-src/style-src规则中。 - 多nonce场景配置方式:
- 调用CI CSP类的
addNonce()方法添加自定义nonce,示例代码如下:
CI会自动将所有添加的nonce值,按规范格式拼接到// 为脚本类资源添加额外的自定义nonce $this->response->getCSP()->addNonce('script', '你的自定义脚本nonce值'); // 为样式类资源添加额外的自定义nonce $this->response->getCSP()->addNonce('style', '你的自定义样式nonce值');Content-Security-Policy响应头的对应规则中,无需手动处理格式。
2. 如果是第三方工具的内联资源无法添加nonce,也可以计算对应内联资源的SHA-256/384/512哈希值,将哈希值添加到CSP的对应规则中,也可以实现豁免,安全性和nonce方案一致。 - 调用CI CSP类的
内容的提问来源于stack exchange,提问作者user4202824
相关产品推荐
相关产品推荐

