Безопасно ли получать данные JSON с помощью jQuery? - PullRequest
7 голосов
/ 18 февраля 2009

JSON позволяет получать данные в нескольких форматах из вызова AJAX. Например:

$.get(sourceUrl, data, callBack, 'json');

может использоваться для получения и анализа кода JSON из sourceUrl.

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

Обычно плохая идея оценивать код из удаленных источников. Я знаю, что спецификация JSON специально не допускает объявления функций, но нет причины, по которой вы не могли бы включить ее в код и иметь небезопасный и наивный потребитель скомпилировать / выполнить код.

Как jQuery справляется с анализом? Это оценивает этот код? Какие меры предосторожности существуют для предотвращения взлома sourceUrl и распространения вредоносного кода?

Ответы [ 4 ]

7 голосов
/ 18 февраля 2009

В последний раз, когда я просматривал (в конце 2008 года), функции JQuery get () getJSON () и т. Д. Внутренне оценивали строку JSon и поэтому подвержены той же проблеме безопасности, что и eval.

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

Вы можете найти такую ​​функцию в https://github.com/douglascrockford/JSON-js/blob/master/json2.js.

См. JSON и Broswer Security для хорошего обсуждения этой области.

В итоге, использование JSON-функций JQuery без анализа входного JSON (с использованием вышеуказанной связанной функции или аналогичного) не является безопасным на 100%.

NB. Если этот вид синтаксического анализа все еще отсутствует в getJSON (возможно, недавно был добавлен), еще важнее понять этот риск из-за возможности междоменной работы из справочных документов JQuery:

Начиная с jQuery 1.2, вы можете загрузить JSON данные, расположенные в другом домене, если вы указать обратный вызов JSONP, который может быть сделано так: "myurl? callback =?". JQuery автоматически заменяет? с правильным именем метода для вызова, вызов указанного вами обратного вызова.

2 голосов
/ 18 февраля 2009

$.getJSON() используется для выполнения (вместо использования eval) кода JavaScript из удаленных источников (с использованием идиомы JSONP, если указан обратный вызов). При использовании этого метода вы полностью можете доверять источнику, поскольку они будут контролировать всю вашу страницу (они могут даже отправлять файлы cookie).

С Дуглас Крокфорд Сайт о Хак скриптов (jsonp):

Так что скрипт может получить доступ и использовать это печенье. Он может получить доступ к исходящий сервер с использованием пользователя авторизации. Это может проверить DOM и глобальный объект JavaScript, и отправить любую информацию, которую он находит где угодно в мире. Script Tag Hack является небезопасен и его следует избегать.

1 голос
/ 18 февраля 2009

Оба IE 8 и Firefox 3.1 будут иметь встроенную поддержку JSON, что обеспечит безопасную альтернативу eval (). Я ожидаю, что другие браузеры последуют его примеру. Я также ожидал бы, что jQuery изменит свою реализацию для использования этих собственных методов.

0 голосов
/ 18 февраля 2009

Все известные мне браузеры отключают межсайтовые запросы через Ajax. То есть, если ваша страница находится на my.example.com, вы ничего не можете загрузить с помощью Ajax, если ее URL-адрес также не указан на my.example.com.

На самом деле это может быть чем-то неприятным, и у злоумышленника есть способы ввести источник другими способами, но якобы это ограничение существует для решения именно той проблемы, о которой вы упоминаете.

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