Подтвердить что ты не робот

JQuery использует (новая функция ( "возврат" + данные))(); вместо eval (данные); чтобы разобрать JSON, почему?

Эта ссылка показывает вам, что jQuery использует (new Function("return " + data))(); для старых браузеров, для синтаксического анализа строки JSON вместо eval().

В чем преимущества этого? Что делать, если строка JSON небезопасна?

4b9b3361

Ответ 1

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

В частности:

function victim() {
    var a= 1;
    eval('a= 2');
    return a;
}

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

Использование регулярной функции вместо этого отнимает этот элемент магии:

function victim() {
    var a= 1;
    (new Function('a= 2;'))();
    return a;
}

в приведенном выше, возвращаемый a остается 1; новая функция может работать только с собственными локальными переменными или глобальными window.a.

Это знание позволяет использовать инструменты анализа кода, которые могут включать в себя механизмы JavaScript и особенно умные minifiers - для применения большего количества оптимизаций. Например, вторая функция victim может иметь переменную a, полностью оптимизированную до return 1. Одно использование eval и много потенциальных оптимизаций не могут быть выполнимыми.

Конечно, на практике для крошечной функции, такой как JSON eval er, не будет заметной разницы, но в целом мышление:

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

Ответ 2

Что касается того, почему jQuery специально использует new Function(), Джон Ресиг ответил на это на форумах jQuery

Использование eval вызывает всевозможные проблемы для кода minifiers, поскольку неясно, что может быть выполнено в eval. Рассматривая последние результаты этого запуска, похоже, что новая функция довольно эквивалентна eval и даже немного быстрее. Единственным исключением был Safari 4, но эти результаты датированы, Safari 4 поставляется с встроенной реализацией JSON.parse, которую мы используем.

Ответ 3

http://www.json.org/js.html

Функция eval выполняется очень быстро. Однако он может скомпилировать и выполнить любую программу JavaScript, поэтому могут возникнуть проблемы с безопасностью. Использование eval указывается, когда источник доверен и компетентен. Гораздо безопаснее использовать парсер JSON. В веб-приложениях через XMLHttpRequest связь разрешается только в том же самом источнике, который предоставляет эту страницу, поэтому ей доверяют. Но он может не быть компетентным. Если сервер не является строгим в своей JSON-кодировке или если он не скрупулезно проверяет все свои входы, он может доставить недопустимый текст JSON, который может содержать опасный script. Функция eval будет выполнить script, развязывая ее злобность.

Что именно вы имеете в виду с безопасностью? Как минимум вредоносный код не выполняется;)

Смотрите также: Альтернативы JavaScript eval() для разбора JSON

Другим моментом может быть то, что new Function() считается немного быстрее, чем eval.

Update:

В основном вы можете прочитать о тех же аргументах в комментариях к функции jQuery .parseJSON().