Альтернативы для Javascript eval [дубликат]
этот вопрос уже есть ответ здесь:
- каковы альтернативы eval в JavaScript? 8 ответов
Mozilla Политика Безопасности Контента запрещает использование функции JavaScript eval, а также встроенных скриптов. Они утверждают, что все экземпляры eval могут быть заменены другим (надеюсь более безопасная) функция. Я согласен в большинстве сценариев, Javascript eval можно заменить, но я не уверен, что замена возможна для каждого случая.
мой вопрос двоякий:
- есть ли общий способ заменить каждую функцию JavaScript eval? (не обязательно быть в безопасности)
- есть ли случай, когда JavaScript eval не может быть заменен?
3 ответов
наиболее распространенными видами использования, которые могут быть заменены, являются следующие. Я бы, конечно, использовал их в первую очередь.
-
доступ к динамическим свойствам
как использовать:
obj[keyAsVariable]
не используйте
eval('obj.' + keyAsVariable)
-
разбор JSON
используйте
JSON.parse(data)
не используйте
eval('(' + data + ')')
-
расчет пользовательский ввод
используйте определенный библиотека
не используйте
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.