Интернет магазин китайских планшетных компьютеров



Компьютеры - JSON - JSONP & JSONPP

02 июня 2011


Оглавление:
1. JSON
2. Синтаксис
3. Сравнение с YAML
4. JSON Schema
5. Вопросы безопасности
6. JSONP & JSONPP
7. Ссылки на объекты



JSONP или «JSON с подкладкой» является расширением JSON, когда имя функции обратного вызова указывается в качестве входного аргумента.

В основу технологии положен тот факт, что политика безопасности браузера разрешает использовать тэг <script type="text/javascript" src="…"></script> для обращения к серверам отличным от сервера с которого произошла загрузка страницы.

Без использования технологии JSONP сервер может вернуть только данные. Например так:

{"paper": "A4", "count": 5}

Однако это только данные и они не могут влиять на браузер.

Используя технику JSONP, стороннему серверу передается в строке вызова имя callback функции:

<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>

Здесь параметр jsonp содержит имя callback функции parseResponse.

Теперь посторонний сервер example.com может вернуть следующий код:

parseResponse

Теперь код вызывает javascript-функцию первого домена.

Первоначально идея была предложена в блоге MacPython в 2005 м году , и в настоящее время используется многими Web 2.0 приложениями, такими, как Dojo Toolkit Applications, Google Toolkit Applications и zanox Web Services. Дальнейшие расширения этого протокола были предложены с учетом ввода дополнительных аргументов, как, например, в случае JSONPP при поддержке S3DB веб-сервисов.

Поскольку JSONP использует скрипт теги, вызовы по сути открыты миру. По этой причине, JSONP может быть неуместными для хранения конфиденциальных данных.

Включение скриптовых тегов от удаленных сайтов позволяет им передать любой контент на сайте. Если удаленный сайт имеет уязвимости, которые позволяют выполнить Javascript инъекции, то исходный сайт также может быть затронут ими.

JSONPP Параметризованый JSON с подкладкой — развитие идеи JSONP

JSONPP включает в себя URL источника, имя функции, которая будет обрабатывать JSON данные, строка для eval после получения данных и строка для eval после окончания обработки данных:

JSON_call;

в итоге оборачивается

ans = JSONP
{
    eval);
    eval;
}

Вообще для самой идеи JSONPP не принципиально количество параметров. Достаточно SRC,JSONP,JSONPP для того, чтобы это был JSONPP.

Рассмотрим на примере работы с сервисом S3DB.

function s3db_jsonpp_call{
        var call = "call_"+Math.random.toString.replace;
        var headID = document.getElementsByTagName;
        var script = document.createElement;
        script.id = call;
        script.type = 'text/javascript';
        // using padded, parameterized json
        src = src+"&format=json&jsonp=s3db_jsonpp&jsonpp="+next_eval+"&onload=remove_element_by_id";
        script.src = src;
        headID.appendChild; // retrieve answer
}
function s3db_jsonpp{
        eval;
        return ans;
}
function remove_element_by_id{
        var e = document.getElementById;
        e.parentNode.removeChild;
        return false;
}

В примере функция s3db_jsonpp_call создаёт в DOM в части head элемент script, src которого соответствует вызову JSONPP.

После получения ответа от сервера будет вызвана s3db_jsonpp — она передана в параметрах вызова, как это должно быть по правилам JSONP.

Внутри s3db_jsonpp сработает eval и произойдёт возврат значения ans.

Вызов eval приводит к выполнению remove_element_by_id с id созданного скрипта в head и в итоге к его удалению, ведь он уже всё равно не будет использоваться поскольку id в примере было сгенерировано случайным образом в самом начале функции s3db_jsonpp_call. Этот вызов в ответе сервера.



Просмотров: 7078


<<< LDIF