Почему использование JavaScript-функции eval - плохая идея? - PullRequest
502 голосов
/ 17 сентября 2008

Функция eval - это мощный и простой способ динамического генерирования кода, так что же такое предостережения?

Ответы [ 25 ]

6 голосов
/ 17 сентября 2008

Это возможный риск безопасности, он имеет другую область исполнения и совершенно неэффективен, поскольку создает совершенно новую среду сценариев для выполнения кода. Смотрите здесь для получения дополнительной информации: eval .

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

5 голосов
/ 17 сентября 2008

Если вы не уверены на 100%, что оцениваемый код получен из надежного источника (обычно вашего собственного приложения), то это верный способ подвергнуть вашу систему атаке межсайтовых скриптов.

5 голосов
/ 18 сентября 2008

Это не обязательно так плохо, если вы знаете, в каком контексте вы его используете.

Если ваше приложение использует eval() для создания объекта из некоторого JSON, который вернулся из XMLHttpRequest на ваш собственный сайт, созданный вашим доверенным кодом на стороне сервера, это, вероятно, не проблема .

Ненадежный код JavaScript на стороне клиента в любом случае не может этого сделать. При условии, что то, что вы выполняете eval(), поступило из разумного источника, у вас все в порядке.

5 голосов
/ 30 ноября 2012

Я знаю, что это обсуждение старое, но мне действительно нравится этот подход от Google, и я хотел поделиться этим чувством с другими;)

Другое дело, что чем лучше Ты получаешь, тем больше Ты пытаешься понять и, наконец, Ты просто не веришь, что что-то хорошо или плохо, просто потому, что кто-то так сказал :) Это очень вдохновляющее видео , которое помогло мне больше думать самостоятельно :) ХОРОШИЕ ПРАКТИКИ хороши, но не используйте их безрассудно:)

4 голосов
/ 09 марта 2010

Если вы хотите, чтобы пользователь вводил некоторые логические функции и оценивал И ИЛИ, тогда функция JavaScript eval является идеальной. Я могу принять две строки и eval(uate) string1 === string2 и т. Д.

4 голосов
/ 18 сентября 2008

Это значительно снижает ваш уровень уверенности в безопасности.

3 голосов
/ 08 мая 2017

Если вы заметили использование eval () в своем коде, помните мантру «eval () - зло».

Это Функция принимает произвольную строку и выполняет ее как код JavaScript. Когда код в вопрос известен заранее (не определяется во время выполнения), нет смысла использовать Eval (). Если код генерируется динамически во время выполнения, часто есть лучший способ достичь цели без eval (). Например, просто используя квадратную скобку доступ к динамическим свойствам стал лучше и проще:

// antipattern
var property = "name";
alert(eval("obj." + property));

// preferred
var property = "name";
alert(obj[property]);

Использование eval() также имеет последствия для безопасности, потому что вы можете выполнять код (для пример из сети), который был подделан. Это распространенный антипаттерн при работе с JSON-ответом на Ajax-запрос. В тех случаях лучше использовать встроенные в браузер методы для анализа ответа JSON, чтобы сделать уверен, что это безопасно и действительно. Для браузеров, которые не поддерживают JSON.parse() изначально, вы можете используйте библиотеку из JSON.org.

Также важно помнить, что передача строк в setInterval(), setTimeout(), и конструктор Function(), по большей части, похож на использование eval() и поэтому необходимо избегать.

За кулисами JavaScript все еще должен оценивать и выполнять строка, которую вы передаете как программный код:

// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

// preferred
setTimeout(myFunc, 1000);
setTimeout(function () {
myFunc(1, 2, 3);
}, 1000);

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

Есть небольшой потенциал выигрыш, потому что код, оцененный в новой функции (), будет работать в локальной функции область видимости, поэтому любые переменные, определенные с помощью var в оцениваемом коде, не станут глобалы автоматически.

Другой способ предотвратить автоматическую глобализацию - это обернуть eval() вызов немедленной функции.

2 голосов
/ 25 октября 2014

eval () очень мощный и может быть использован для выполнения оператора JS или оценки выражения. Но вопрос не в том, как использовать eval (), а в том, как злоумышленник влияет на строку, которую вы запускаете с eval (). В конце вы будете использовать вредоносный код. С силой приходит большая ответственность. Так что используйте это с умом, если вы используете это. Это не сильно связано с функцией eval (), но эта статья содержит довольно хорошую информацию: http://blogs.popart.com/2009/07/javascript-injection-attacks/ Если вы ищете основы eval (), посмотрите здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

2 голосов
/ 08 октября 2014

Это одна из хороших статей, рассказывающих о eval и о том, как он не является злом: http://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/

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

2 голосов
/ 17 сентября 2008

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

...