2015-12-08 4 views
0

У меня есть строка, которая выглядит примерно так:Как получить функцию из строки без использования Eval/новой функции (CSP)

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

, и я хочу, чтобы превратить это в функцию.

я могу сделать это с помощью eval или new Function, например:

var fn = eval(codeStr); 

Но когда содержание-безопасность политика активна и не позволяет «небезопасный-Eval», это блокируется.

Важное примечание: недостаточно просто запустить строку кода. Мне нужно также вернуть значение в переменную.

Учитывается безопасность кода запуска из строки.

ответ

0

Одним из решений является добавление тега < сценария на страницу и вставка в него строки кода, вызывающие его запуск. Но вы тоже хотите получить возвращаемое значение.

Чтобы получить возвращаемое значение, вы можете обернуть код в функцию обратного вызова. Действительно интересная часть (ну, это меня удивило), заключается в том, что код работает полностью синхронно!

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); 

Этот ответ не является идеальным для всех приложений, так как она требует контент-безопасности-политики, чтобы «небезопасных-инлайн» или «одноразового номера».