You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

script-src哈希仅适用于内联脚本?如何配置CSP通过哈希允许本地JS文件

CSP中script-src哈希的适用范围及外部脚本哈希授权方法

核心结论

script-src的哈希仅适用于内联脚本,外部通过src加载的JS文件无法直接用内容哈希在script-src中授权——这是CSP的设计规则:哈希的作用是校验内联代码的完整性,而外部脚本的完整性校验需要配合integrity属性和特定CSP指令。

你的测试场景解析

你用以下Apache配置放行内联脚本成功:

Header set Content-Security-Policy-Report-Only: "script-src  'sha256-U82JgRvGjy4mzia+G8DutvX8V/W33LIoO2UuwT+rE/0='"

这是因为哈希完全匹配了<script>alert('hello everybody')</script>中的内联代码内容,符合CSP对哈希授权内联脚本的规则。

但当你把代码移到test.js后,即使文件内容和内联代码一致,CSP也不会用script-src中的哈希去匹配外部文件的内容,所以触发拦截提示:

[Report Only] Refused to load the script 'http://localhost/test.js' because it violates the following Content Security Policy directive: "script-src 'sha256-U82JgRvGjy4mzia+G8DutvX8V/W33LIoO2UuwT+rE/0='". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.

如何用哈希允许本地JS文件

要通过哈希授权外部JS文件,需要结合HTML的integrity属性和CSP的'unsafe-hashes'指令,步骤如下:

  1. 保留原哈希值:你已经算出的sha256-U82JgRvGjy4mzia+G8DutvX8V/W33LIoO2UuwT+rE/0=可以继续使用,因为它匹配test.js的内容。
  2. 给script标签添加integrity属性:
    <script src="test.js" integrity="sha256-U82JgRvGjy4mzia+G8DutvX8V/W33LIoO2UuwT+rE/0=" crossorigin="anonymous"></script>
    
    注意:crossorigin="anonymous"是必填项,即使是本地文件,浏览器也需要这个属性启用完整性校验逻辑。
  3. 修改CSP配置,添加'unsafe-hashes':
    Header set Content-Security-Policy-Report-Only: "script-src 'unsafe-hashes' 'sha256-U82JgRvGjy4mzia+G8DutvX8V/W33LIoO2UuwT+rE/0='"
    

补充说明

  • 'unsafe-hashes'并非真的不安全,它的作用是允许CSP使用哈希来授权那些原本需要unsafe-inline的场景,这里是允许通过哈希匹配外部脚本的integrity属性。
  • 如果你不想使用'unsafe-hashes',也可以用其他方式授权外部脚本:比如指定'self'(允许同域资源)、完整文件URL,或者使用nonce(一次性随机值,每次请求需动态生成)。

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:15:40