Альтернатива для eval () для выполнения автоматически сгенерированного кода JS с сервера - PullRequest
0 голосов
/ 25 октября 2018
var val = 3;

var code = "var a = 5; if (a >= val) { console.log(a + ' >= ' + val); a; } else { console.log(a + ' < 3 ' + val); val; }";


console.log(eval(code));

В этом сценарии требуется альтернатива eval ().Сервер может отправлять любой код JS, который может быть запущен для определенного блока.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Не используйте eval(code) или new Function(code), поскольку оба они в основном одно и то же и должны быть заблокированы CSP.

Просто верните свой контент с сервера как content-type: text/javascript, а затем перенесите его на свою страницус блоком <script> или import.

На сервере у вас будет что-то вроде (псевдокод, поскольку я не знаю, в каком техническом стеке вы находитесь):

[Route("serverActionReturningCode")]
public string ActionReturningCode() 
{
    // return the content as JS
    Response.Headers.Add("content-type", "text/javascript");

    // build the response object as JS
    return "window.latestResult = {" + 
        "a: '" + a + "', " +
        "b: '" + b + "', " + 
        "generatedCode: function() { ... }" + 
    "};";
}

Тогда на вашей странице:

<script src="serverActionReturningCode"></script>
<script>
     // Now the script above has run and set window.latestResult
     console.log('a', window.latestResult.a);
     console.log('b', window.latestResult.b);
     console.log('function output', window.latestResult.generatedCode());
</script>

Это позволит вам динамически генерировать функции JS на сервере.

Однако, если вы можете избежать функций и просто должны передать их значенияВместо этого гораздо проще использовать JSON.

0 голосов
/ 29 октября 2018

Похоже, что нет другого способа, кроме как жить с eval или изменить весь дизайн приложения .Даже если мы ищем какие-либо другие альтернативы, это будет изменение имени и синтаксиса.Но проблемы безопасности будут такими же .Проект приложения заключается в том, что инструмент JS CodeGen на сервере будет генерировать фрагменты кода JS и отправлять его через JSON в определенных полях, которые необходимо выбрать и выполнить во внешнем интерфейсе.Но в этом проекте мы можем с уверенностью сказать, что код JS генерируется только во время разработки пользователя, а не во время выполнения .Спасибо за вашу помощь.

0 голосов
/ 25 октября 2018

Вы можете сделать это так.Использование Eval() не рекомендуется.

function looseJsonParse(obj){
    return Function('"use strict";return (' + obj + ')')();
}
console.log(looseJsonParse(
   "{a:(4-1), b:function(){}, c:new Date()}"
)) 

Обратитесь к этой статье MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval, чтобы узнать больше.

...