我有一个看起来像这样的字符串:
var codeStr = "function a(){alert(4);}"
我希望把它变成一个函数。
我可以使用eval
或new Function
执行此操作,例如:
var fn = eval(codeStr);
但是当content-security-policy处于活动状态并且不允许" unsafe-eval"时,会被阻止。
重要提示:仅仅运行代码字符串还不够。我也需要将返回值变为变量。
考虑了从字符串运行代码的安全性。
答案 0 :(得分:0)
一种解决方案是添加< script>标记到页面并将代码字符串放在其中,使其运行。但是你也想要返回值。
要获取返回值,可以将代码包装在回调函数中。真正有趣的部分(好吧,让我感到惊讶)是,代码完全同步运行!
function myEval(codeStr) {
var result;
// Define callback
window.evalCallback = function(r){
result = r;
};
var newScript = document.createElement("script");
newScript.innerHTML = "evalCallback(" + codeStr + ");";
/*
* // Add CSP nonce if relevant
* newScript.setAttribute("nonce", nonce);
*/
document.body.appendChild(newScript);
// Now clean up DOM and global scope
document.body.removeChild(newScript);
delete window.evalCallback;
return result;
};
然后致电:
var fn = myEval(codeStr);
这个答案并不适用于所有应用程序,因为它要求内容安全策略允许" unsafe-inline"或者是" nonce"。