Эта ссылка показывает Вам тот jQuery использование (new Function("return " + data))();
для более старых браузеров, для парсинга строки JSON вместо eval()
.
Каковы преимущества этого? Что, если строка JSON не безопасна?
Цитата в ответе Ника намекает на это. На самом деле это не большая разница, но ощущение такое, что eval
«хуже», чем new Function
. Не с точки зрения безопасности - они оба одинаково бесполезны перед лицом ненадежного ввода, но, надеюсь, ваше веб-приложение не возвращает ненадежные строки JSON, а с точки зрения странностей на уровне языка и, следовательно, сопротивления оптимизации.
В частности:
function victim() {
var a= 1;
eval('a= 2');
return a;
}
дает 2
. Строка eval
ed воздействовала на область локальной переменной жертвы
! Это то, что обычная функция, написанная пользователем, никогда не сможет сделать; eval
может это делать только потому, что это темная магия.
Вместо этого использование обычной функции устраняет этот элемент магии:
function victim() {
var a= 1;
(new Function('a= 2;'))();
return a;
}
выше, возвращенный a
остается 1
; новая функция может работать только со своими собственными локальными переменными или с глобальным window.a
.
Эти знания позволяют инструментам анализа кода, которые могут включать в себя движки JavaScript и особенно умные минификаторы, применять больше оптимизаций. Например, вторая функция жертвы
может иметь переменную a
, полностью оптимизированную для , возвращающую 1
. Одно использование eval
и множество потенциальных оптимизаций не выполнимы.
Конечно, на практике для такой крошечной функции, как JSON eval
er, заметной разницы не будет, но в целом идея такова:
новая функция
предпочтительнее eval
, если вам действительно не нужен код для доступа локальные переменные вызывающей функции. Что касается того, почему jQuery специально использует новую функцию ()
, Джон Ресиг ответил на это на форумах jQuery
Использование eval вызывает всевозможные проблемы для минификаторов кода, поскольку неясно, что может выполняться в eval. Глядя на последние результаты этого запуска, кажется, что новая функция в значительной степени эквивалентна eval, а иногда даже немного быстрее. Единственным исключением был Safari 4, но эти результаты датированы, Safari 4 поставляется с собственной реализацией JSON.parse, которую мы используем.
Функция
eval
работает очень быстро. Однако он может скомпилировать и выполнить любую программу JavaScript , поэтому могут возникнуть проблемы с безопасностью. Использованиеeval
указано, когда источник надежный и компетентный . Намного безопаснее использовать парсер JSON . В веб-приложениях через XMLHttpRequest обмен данными разрешен только с тем же источником, который предоставляет эту страницу, поэтому он является доверенным. Но он может не быть компетентным . Если сервер не является строгим в своей кодировке JSON или если он не проверяет тщательно все свои входные данные, он может доставить недопустимый текст JSON, который может содержать опасный сценарий . Функция eval выполнит сценарий, высвободив его злобу.
Что именно вы имеете в виду под сейфом ? По крайней мере, вредоносный код не выполняется;)
См. Также: Альтернативы JavaScript eval () для синтаксического анализа JSON
Другой момент может заключаться в том, что new Function ()
является считается немного быстрее , чем eval
.
Обновление:
В основном вы можете прочитать о тех же аргументах в комментариях к функции jQuery .parseJSON ()
.