Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
208
Добавлен:
10.05.2015
Размер:
4.05 Mб
Скачать

13.1.3. Использование json в Ajax

Следующий фрагмент Javascript-кода показывает, как клиент может использовать XMLHttpRequest, чтобы запрашивать с сервера объект в формате JSON:

var the_object;

var http_request = new XMLHttpRequest();

http_request.open("GET", url, true);

http_request.send(null);

http_request.onreadystatechange = function() {

if (http_request.readyState == 4) {

if (http_request.status == 200) {

the_object = eval("(" + http_request.responseText + ")");

} else {

alert("Проблема с URL.");

}

http_request = null;

}

};

Полезность XMLHttpRequest ограничивается политикой ограничения домена: URL ответа на запрос должен проживать в том же DNS домене, что и сервер, на котором находится страница, содержащая запрос.

Браузеры могут также использовать элементы <iframe> асинхронный запрос JSON данных в кросс-браузер мода, или использовать простые <form action="url_to_cgi_script" target="name_of_hidden_iframe"> представлений. Эти подходы были распространены до появления широкой поддержки XMLHttpRequest.

13.1.4. Вопросы безопасности

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

13.1.4.1. JavaScript eval()

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

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

var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(

text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');

Как более безопасная альтернатива eval() была предложена новая функция parseJSON(), способная обрабатывать только JSON-данные.

13.1.4.2. Подделка кроссдоменного запроса

Непродуманное использование JSON делает сайты уязвимым к подделке межсайтовых запросов (CSRF или XSRF). Поскольку тэг <script> допускает использование источника, не принадлежащего к тому же домену, что и использующий ресурс, это позволяет выполнять код под видом данных, представленных в формате JSON, в контексте произвольной страницы, что делает возможным компрометацию паролей или другой конфиденциальной информации пользователей, прошедших авторизацию на другом сайте.

Это представляется проблемой только в случае содержания в JSON-данных конфиденциальной информации, которая может быть компрометирована третьей стороной и если сервер рассчитывает на политику одного источника, блокируя доступ к данным при обнаружении внешнего запроса. Это не является проблемой, если сервер определяет допустимость запроса, предоставляя данные только в случае его корректности. HTTP cookie нельзя использовать для определения этого. Исключительное использование HTTP cookie используется подделкой межсайтовых запросов.