Понимание 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();
}

Спасибо заранее.

Ответ 1

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

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

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

Ответ 2

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

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

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

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