如何在不使用eval / new函数(CSP)的情况下从字符串中获取函数

时间:2015-12-08 13:45:47

标签: javascript content-security-policy

我有一个看起来像这样的字符串:

var codeStr = "function a(){alert(4);}"

我希望把它变成一个函数。

我可以使用evalnew Function执行此操作,例如:

var fn = eval(codeStr);

但是当content-security-policy处于活动状态并且不允许" unsafe-eval"时,会被阻止。

重要提示:仅仅运行代码字符串还不够。我也需要将返回值变为变量。

考虑了从字符串运行代码的安全性。

1 个答案:

答案 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"。