如何修复jQuery 3.7.0违反CSP的内联脚本问题
临时修复jQuery DOMEval违反CSP的方案
先明确:基础功能是否需要DOMEval?
DOMEval是jQuery内部用于动态执行脚本的核心函数,主要服务于这些场景:
jQuery.globalEval方法执行字符串代码- 解析HTML片段(如
$(html))时自动执行其中的<script>标签 - 远程脚本加载完成后的部分内部逻辑
如果你的需求仅为基础DOM操作、事件绑定、普通AJAX请求(不涉及动态脚本执行),完全可以替换或禁用这个函数,不会影响核心功能。
方案1:用eval替换(最简单,需CSP允许unsafe-eval)
将原DOMEval函数直接替换为以下代码,利用脚本内部的eval执行代码,这种方式不属于CSP禁止的"内联脚本"范畴(只要你的CSP没有添加'unsafe-eval'的限制):
function DOMEval(code, node, doc) { doc = doc || document; const global = doc.defaultView || window; global.eval(code); }
注意:如果你的CSP明确禁止了unsafe-eval,这个方案不可用,换方案2。
方案2:用Blob URL加载脚本(无需unsafe-eval,需修改CSP)
如果不能用eval,可以通过Blob生成临时URL加载脚本,避免内联脚本触发CSP。需要先修改你的CSP,添加blob:到script-src:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' blob:">
然后替换DOMEval函数为:
function DOMEval(code, node, doc) { doc = doc || document; const blob = new Blob([code], { type: 'application/javascript' }); const script = doc.createElement('script'); const blobUrl = URL.createObjectURL(blob); script.src = blobUrl; // 保留原有的属性继承逻辑(如nonce) if (node) { for (const attr in preservedScriptAttributes) { const value = node[attr] || (node.getAttribute && node.getAttribute(attr)); if (value) { script.setAttribute(attr, value); } } } // 执行完成后清理资源 script.onload = () => { URL.revokeObjectURL(blobUrl); script.remove(); }; doc.head.appendChild(script); }
方案3:禁用动态脚本执行(仅保留纯基础功能)
如果完全不需要动态执行脚本的能力,直接把DOMEval改成空函数即可,这样既不会触发CSP,也不影响DOM操作、事件绑定等核心功能:
function DOMEval(code, node, doc) { // 空实现,禁止动态执行脚本 }
风险提示:如果后续用到$.globalEval或加载带<script>的HTML片段,这些功能会失效。
内容的提问来源于stack exchange,提问作者JSG
相关产品推荐
相关产品推荐

