Данные JSON - проанализированы или оценены - PullRequest
4 голосов
/ 17 июля 2009

С точки зрения безопасности, я вижу, как просто выполнить eval для входящих данных JSON как критическую ошибку. Если у вас есть данные, как показано ниже, у вас будут некоторые проблемы.

{ someData:((function() { 
    alert("i'm in ur code hackin' ur page"); 
})()) }

Мне было интересно, что делают самые популярные библиотеки Javascript? Это ручной анализ или просто eval?

[Изменить]

Я не спрашиваю, должен ли I eval / parse - я спрашивал, какими методами пользуются некоторые популярные библиотеки Javascript (jQuery, Prototype и т. Д.)

Ответы [ 4 ]

7 голосов
/ 17 июля 2009

Вот что делает официальный парсер JavaScript :

// In the second stage, we run the text against regular expressions that look
// for non-JSON patterns. We are especially concerned with '()' and 'new'
// because they can cause invocation, and '=' because it can cause mutation.
// But just to be safe, we want to reject all unexpected forms.

// We split the second stage into 4 regexp operations in order to work around
// crippling inefficiencies in IE's and Safari's regexp engines. First we
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
// replace all simple value tokens with ']' characters. Third, we delete all
// open brackets that follow a colon or comma or that begin the text. Finally,
// we look to see that the remaining characters are only whitespace or ']' or
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.

if (/^[\],:{}\s]*$/.
    test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
    replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
    replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

    j = eval('(' + text + ')');

    ...

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

Защищенные библиотеки (в дополнение к официальной реализации json2)

Функция прототипа isJSON.

Mootools 'функция JSON.decode (опять же, с помощью теста регулярных выражений до eval).

Небезопасные библиотеки :

dojo's fromJson делает не безопасным eval ing. Вот их полная реализация (без комментариев) :

dojo.fromJson = function(json) {
    return eval("(" + json + ")");
}

jQuery не обеспечивает безопасное использование JSON eval, но см. Функцию secureEvalJSON официального плагина (строка 143).

1 голос
/ 17 июля 2009

Вы должны абсолютно разобрать это! JSON - это только часть JavaScript. Но eval будет оценивать любой код JavaScript, а не это конкретное подмножество, как анализатор JSON.

0 голосов
/ 30 сентября 2009

С http://code.google.com/p/json-sans-eval/:

Быстрый и безопасный анализатор JSON в JavaScript

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

В JSON есть несколько парсеров JavaScript? на json.org. это реализация должна использоваться всякий раз, когда безопасность является проблемой (когда JSON может исходить из ненадежного источника), скорость является проблемой, и ошибка на Неправильное форматирование JSON не является проблемой.

Эта реализация

  • Плюсы Быстрый, безопасный
  • Минусы Не проверяет

json_parse.js

  • Pros Validating, безопасный
  • Минусы Медленный

json2.js

  • Pros Fast, некоторая проверка
  • Минусы Потенциально небезопасные

json2.js очень быстрый, но потенциально небезопасно, так как вызывает Eval для анализа Данные JSON, поэтому злоумышленник может в состоянии поставить странный JS, который выглядит как JSON, но это выполняется произвольно JavaScript.

Если вам нужно использовать json2.js с Ненадежные данные, убедитесь, что вы держите ваша версия json2.js актуальна, так что вы получаете патчи, как они освобожден.

0 голосов
/ 17 июля 2009

используйте evalJSON () вместо?
Насколько я знаю, это в основном вызывает eval () после некоторых санитарных проверок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...