Использование new Function () небезопасно во всех случаях? - PullRequest
0 голосов
/ 14 мая 2018

Я работаю над проектом, который создает новую функцию, а затем возвращает оцененную строку шаблона. Мой код выглядит так:

var myString = "${hello}"
var myFunc = new Function("hello", 'return `' + myString + '`')
document.getElementById("tdiv").innerHTML = myFunc("whassup")

Это прекрасно работает, как вы можете видеть на моем JSFiddle: https://jsfiddle.net/nebrelbug/28c7hfm8/. Однако это угроза безопасности? Функции автоматически имеют строгое использование, поэтому они не могут получить доступ к переменным, кроме тех, которые я передаю. Я не понимаю, как это повлияет на безопасность.

Если это угроза безопасности, объясните, пожалуйста, почему. Если нет, то большинство оценщиков безопасности, таких как 'npm аудит' или Github, пометят его как единое целое?

Спасибо!

1 Ответ

0 голосов
/ 14 мая 2018

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

const foo = 'foo';
const bar = eval('foo');

Этот код, точно так же, как и ни с чем другим, очевидно, не является угрозой безопасности, но вы не можете полностью полагаться на оценщиков безопасности, чтобы полностьюточно проверяйте, действительно ли то, как вы реализуете что-то, является на самом деле безопасным или нет - они используют запрограммированную эвристику, а не специалист по безопасности человека, проверяющий ваш код на наличие дыр.Таким образом, использование eval и его родственников, таких как new Function, более тесно коррелирует с небезопасным кодом.

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

var myString = "foo ${hello} bar";
function myFunc(replaceHelloWith) {
  return myString.replace(/\$\{hello\}/g, replaceHelloWith);
}
console.log(myFunc("whassup"));
...