использование jQuery (новая Функция (“возвращаются” + данные)) (); вместо оценки (данные); проанализировать JSON, почему?

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

Каковы преимущества этого? Что, если строка JSON не безопасна?

17
задан Luca Matteis 15 March 2010 в 07:46
поделиться

3 ответа

Цитата в ответе Ника намекает на это. На самом деле это не большая разница, но ощущение такое, что 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, заметной разницы не будет, но в целом идея такова:

  • по возможности избегайте обоих подходов. (они оба запрещены в строгом режиме ECMAScript Fifth Edition);
  • , если вам нужно использовать один, новая функция предпочтительнее eval , если вам действительно не нужен код для доступа локальные переменные вызывающей функции.
32
ответ дан 22 October 2019 в 01:04
поделиться

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

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

11
ответ дан 22 October 2019 в 01:04
поделиться

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

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

Что именно вы имеете в виду под сейфом ? По крайней мере, вредоносный код не выполняется;)

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

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

Обновление:

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

3
ответ дан 22 October 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: