Понимание 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 и должны быть защищены сервером.