Альтернативы для Javascript eval [дубликат]

этот вопрос уже есть ответ здесь:

Mozilla Политика Безопасности Контента запрещает использование функции JavaScript eval, а также встроенных скриптов. Они утверждают, что все экземпляры eval могут быть заменены другим (надеюсь более безопасная) функция. Я согласен в большинстве сценариев, Javascript eval можно заменить, но я не уверен, что замена возможна для каждого случая.

мой вопрос двоякий:

  1. есть ли общий способ заменить каждую функцию JavaScript eval? (не обязательно быть в безопасности)
  2. есть ли случай, когда JavaScript eval не может быть заменен?

3 ответов


наиболее распространенными видами использования, которые могут быть заменены, являются следующие. Я бы, конечно, использовал их в первую очередь.

  1. доступ к динамическим свойствам

    как использовать: obj[keyAsVariable]

    не используйте eval('obj.' + keyAsVariable)

  2. разбор JSON

    используйте JSON.parse(data)

    не используйте eval('(' + data + ')')

  3. расчет пользовательский ввод

    используйте определенный библиотека

    не используйте eval(input)

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

var s = document.createElement('script')
s.src = 'request_script?data=' + data;
document.getElementsByTagName('head')[0].appendChild(s);

request_script может быть файл, реализованный в PHP, как показано ниже. Опять же, это плохая практика, но это общий способ обхода eval.

<?
echo $_GET['data'];
?>

можно сказать, что это также автоматически отвечает на ваш второй вопрос "нет".


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


загрузить как скрипт с помощью Blob

вместо eval вы также можете использовать Blob и загрузите код, как если бы он был внешним : Чтобы убедиться, что функции или переменные, находящиеся внутри загружаемого кода, доступны, необходимо использовать callback метод, который будет срабатывать onload событие.

var code = "console.log('hello world');";

// With eval:
eval(code);

// With a blob:
var blob = new Blob([code], {type: 'text/javascript'});
var urlCreator = window.URL || window.webkitURL;
var url = urlCreator.createObjectURL( blob );

function loadScript(url, callback)
{
    // Add a the script tag to the head
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;

    // Bind the callback (depends on browser compatibility).
    script.onreadystatechange = callback;
    script.onload = callback;

    // Load the script
    head.appendChild(script);
}

// Any variables or methods inside the code will be on callback.
loadScript(url, callback);

Примечание имейте в виду, что опасность для инъекции кода аналогична eval.