script-src指令在标签中完全无效,浏览器会静默忽略;必须通过http响应头设置content-security-policy才能拦截外链js。

meta标签根本不能限制外链JS
直接说结论:script-src 指令在 <meta> 标签里完全无效,浏览器会静默忽略它。你写 <meta http-equiv="Content-Security-Policy" content="script-src 'self' https://trusted.com">,但 <script src="https://evil.com/bad.js"></script> 依然能加载执行——这不是配置漏了,是规范和实现层面的硬性限制。
为什么script-src在meta里不生效
W3C 规范明确限定:<meta> 只支持部分低风险指令(如 img-src、style-src、base-uri),而涉及脚本加载与执行的指令(script-src、connect-src、frame-src)一律被丢弃,不报错、不警告、也不拦截。
- Chrome、Firefox、Edge 均一致实现该行为,不是某一个浏览器的 bug
- DevTools 的 Security 标签页显示 “No CSP header found”,就说明策略没起作用
-
<meta>是 HTML 解析过程中同步读取的,等它被解析时,前面的<script></script>和onclick早已执行完毕 - Safari 16.4 之前甚至会跳过含
nonce-的整条指令;Chrome 124+ 已彻底移除对'unsafe-inline'在<meta>中的支持
真正能拦外链JS的唯一方式
必须通过 HTTP 响应头设置 Content-Security-Policy,且需服务端配合。客户端无法绕过。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- Nginx 示例:
add_header Content-Security-Policy "script-src 'self' https://cdn.example.com; object-src 'none'"; - Express 示例:
res.setHeader('Content-Security-Policy', "script-src 'self' 'nonce-abc123' https://trusted-cdn.com"); - Apache 示例:
Header set Content-Security-Policy "script-src 'self' https://trusted-cdn.com" - 注意:如果服务端返回了任意
Content-Security-Policy响应头(哪怕拼错),<meta>就会被完全无视
容易被忽略的关键细节
即使你正确配置了响应头,script-src 白名单也只管 <script src="..."></script>,对内联脚本(<script>alert(1)</script>、onclick 属性、javascript: 伪协议)默认全部拦截——除非显式加 'unsafe-inline'(不推荐)或用 nonce-/sha256- 授权。
nonce- 只对 <script nonce="..."></script> 有效,对 onclick 完全无效;想保留交互逻辑,必须剥离内联事件,改用 addEventListener。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










