Понимание XMLHttpRequest через CORS (responseText)

Для проекта я смотрю на различные элементы HTML5 и Javascript и безопасность вокруг них, и сейчас пытаюсь разобраться в CORS.

На основании моего тестирования, если я удалю..

<?php
 header("Access-Control-Allow-Origin: *"); 
 header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
 ?>

... со страницы, к которой пытаются получить доступ, я вижу следующее в журнале консоли в Chrome:

XMLHttpRequest cannot load http://www.bla.com/index.php. Origin http://bla2.com is not allowed by Access-Control-Allow-Origin.

Я понимаю, что это правильно, но Wireshark показывает HTTP/1.1 200 OK в ответе и в данных показывает источник запрашиваемой страницы. Так это только браузер и Javascript, который блокирует использование responseText каким-либо существенным способом, даже если он фактически передан?

Код такой же, как показано ниже:

  function makeXMLRequest() {
  xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4) {
        alert(xmlhttp.responseText);
    }
}
xmlhttp.open("GET","http://www.bla.com/index.php",true);
xmlhttp.send();
}

Заранее спасибо.

2 ответа

Решение

Для "простого" HTTP-глагола, такого как GET или POST, да, вся страница извлекается, и затем браузер решает, сможет ли JavaScript использовать содержимое или нет. Серверу не нужно знать, откуда поступают запросы; работа браузера заключается в проверке ответа от сервера и определении, разрешено ли JS просматривать содержимое.

Для "непростого" HTTP-глагола, такого как PUT или DELETE, браузер выдает "предварительный запрос" с использованием запроса OPTIONS. В этом случае браузер сначала проверяет, поддерживается ли домен и глагол, проверяя Access-Control-Allow-Origin а также Access-Control-Allow-Methodsсоответственно. (См. "Обработка непростого запроса" на странице CORS HTML5 Rocks для получения дополнительной информации.) В ответе перед полетом также перечислены допустимые непростые заголовки, включенные в Access-Control-Allow-Headers,

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

Так это только браузер и Javascript, который блокирует использование responseText каким-либо существенным способом, даже если он фактически передан?

Да. Вы можете сделать любой запрос с JS.

Это доступ к данным, который запрещает та же самая политика происхождения.

Запросы, которые делают вредоносные вещи (такие как "POST http://bank.example/give/money?to=attacker" или же "POST http://forum.example.com/post?message=spamspamspamspam") называются атаками CSRF и должны быть защищены сервером.

Другие вопросы по тегам