🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
问题描述
在JavaScript开发过程中,开发者经常会遇到 EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive
的错误提示。该错误通常表示在代码中尝试使用 eval()
或类似功能动态执行字符串形式的JavaScript代码,但当前页面的内容安全策略(CSP)配置禁止了这种行为。
原因分析
-
Content Security Policy (CSP):CSP是一种安全机制,用于限制浏览器加载和执行外部资源,如脚本、样式和图像。CSP通过
script-src
等指令指定哪些源是可信的。默认情况下,script-src
不允许unsafe-eval
,这意味着任何通过eval()
或Function()
等方法执行的字符串代码都不会被允许。 -
使用
eval()
和类似功能:开发者可能会在代码中使用eval()
函数来动态执行字符串形式的JavaScript代码。例如:eval("var sum = new Function('a', 'b', 'return a + b'); sum(1, 2);");
这种做法在CSP策略中是不允许的,除非明确允许
unsafe-eval
。 -
浏览器插件和扩展:某些浏览器插件或扩展可能会尝试使用
unsafe-eval
,如果它们的CSP配置不正确,也会导致这个错误。例如,Chrome扩展在更新后可能会禁用unsafe-eval
,导致依赖于该功能的插件无法正常工作。
解决方案
1. 避免使用 eval()
尽量避免在代码中使用 eval()
和类似功能。可以使用其他安全的替代方法,如:
-
Function构造函数:
function add(a, b) { return a + b; } add(1, 2);
-
模板字符串:
const sum = (a, b) => a + b; sum(1, 2);
-
DOM操作:如果需要在客户端动态执行代码,可以考虑使用DOM操作API,如
innerHTML
或createElement
。
2. 配置Content Security Policy (CSP)
如果确实需要使用 eval()
或类似功能,可以在CSP策略中添加 unsafe-eval
。例如,在HTML文件的 <head>
部分添加以下元数据标签:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval';">
或者在服务器端设置HTTP响应头:
Content-Security-Policy: script-src 'self' 'unsafe-eval';
3. 使用安全的替代方案
如果可能,尽量使用安全的替代方案来替代 eval()
。例如,使用 Function
构造函数时,确保传递给函数的参数是安全的:
function defineGetter(prop, data) {
return Object.defineProperty(this, prop, {
get: () => data
});
}
4. 更新和测试插件
对于浏览器插件和扩展,确保其CSP配置正确。可以尝试更新插件到最新版本,或者联系插件开发者,询问他们是否计划在未来的版本中解决此问题。
实战案例
假设有一个插件需要动态执行一些代码,但遇到了 EvalError
:
// popup.js
document.ready(function() {
$.getJSON('http://alerts.json', function(data) {
eval("alert('HELLO');"); // 报错: EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive
});
});
解决方案是避免使用 eval()
,改用安全的替代方法:
// popup.js
document.ready(function() {
$.getJSON('http://alerts.json', function(data) {
alert('HELLO');
});
});
总结
EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive
错误通常是由于在CSP策略中未允许 unsafe-eval
,而代码中使用了 eval()
或类似功能。通过以下方法可以有效避免该问题:
- 避免使用
eval()
:尽量使用其他安全的替代方法,如Function
构造函数、模板字符串或DOM操作。 - 配置CSP:在CSP策略中添加
unsafe-eval
,但需谨慎使用,避免引入安全风险。 - 使用安全的替代方案:确保传递给
Function
构造函数的参数是安全的。 - 更新和测试插件:确保浏览器插件和扩展的CSP配置正确。
通过这些方法,开发者可以提高代码的健壮性,减少运行时错误,提升应用的稳定性和用户体验。建议开发者定期检查和测试代码,确保所有引用都正确无误。