Ответ 1
Метод document.domain
- Тип метода: iframe.
Обратите внимание, что это метод iframe, который устанавливает значение document.domain в суффикс текущего домена. Если это так, более короткий домен используется для последующих проверок происхождения. Например, предположим, что script в документе в http://store.company.com/dir/other.html
выполняет следующее утверждение:
document.domain = "company.com";
После выполнения этого утверждения страница проведет проверку происхождения с помощью http://company.com/dir/page.html
. Однако по тем же соображениям company.com не может установить document.domain
в othercompany.com
.
С помощью этого метода вам будет разрешено вызывать javascript из iframe, полученного на субдомене на странице, полученной в основном домене. Этот метод не подходит для междоменных ресурсов, поскольку такие браузеры, как Firefox, не позволят вам изменить document.domain
на полностью чуждый домен.
Источник: https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript
Метод совместного использования ресурсов Cross-Origin
- Тип метода: AJAX.
Совместное использование ресурсов для разных источников (CORS) - это рабочий проект W3C, который определяет, как браузер и сервер должны взаимодействовать при доступе к источникам через источник, Основная идея CORS заключается в использовании пользовательских HTTP-заголовков, позволяющих обозревателю и серверу достаточно знать друг друга, чтобы определить, будет ли запрос или ответ успешным или неудачным.
Для простого запроса, который использует либо GET
, либо POST
без пользовательских заголовков и чье тело text/plain
, запрос отправляется с дополнительным заголовком Origin
. Заголовок Origin содержит начало (протокол, имя домена и порт) запрашивающей страницы, чтобы сервер мог легко определить, должен ли он отвечать на ответ. Пример Origin
заголовок может выглядеть следующим образом:
Origin: http://www.stackoverflow.com
Если сервер решает, что запрос должен быть разрешен, он отправляет заголовок Access-Control-Allow-Origin
, эхо возвращающий тот же исходный код, который был отправлен, или *
, если это общедоступный ресурс. Например:
Access-Control-Allow-Origin: http://www.stackoverflow.com
Если этот заголовок отсутствует или исходное имя не совпадает, браузер не разрешает запрос. Если все хорошо, браузер обрабатывает запрос. Обратите внимание, что ни запросы, ни ответы не содержат информацию о файлах cookie.
Команда Mozilla предлагает в их сообщение о CORS, что вы должны проверить наличие свойства withCredentials
, чтобы определить, является ли браузер поддерживает CORS через XHR. Затем вы можете связать с существованием объекта XDomainRequest
для охвата всех браузеров:
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
var request = createCORSRequest("get", "http://www.stackoverflow.com/");
if (request){
request.onload = function() {
// ...
};
request.onreadystatechange = handler;
request.send();
}
Обратите внимание, что для работы метода CORS вам необходимо иметь доступ к любому типу обработчика заголовков сервера и не может просто обращаться к любому стороннему ресурсу.
Источник: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
Метод window.postMessage
- Тип метода: iframe.
window.postMessage
при вызове вызывает отправку MessageEvent
в целевом окне, когда все ожидающие завершения функции script завершаются (например, оставшиеся обработчики событий, если window.postMessage
вызывается из обработчика события, ранее -set ожидания ожидания и т.д.). MessageEvent
имеет сообщение типа, свойство data
, которое устанавливается в строковое значение первого аргумента, предоставленного в window.postMessage
, свойство Origin
, соответствующее началу основного документа в окне, вызывающем window.postMessage
в момент времени window.postMessage
и свойство source
, которое является окном, из которого вызывается window.postMessage
.
Чтобы использовать window.postMessage
, необходимо подключить прослушиватель событий:
// Internet Explorer
window.attachEvent('onmessage',receiveMessage);
// Opera/Mozilla/Webkit
window.addEventListener("message", receiveMessage, false);
И должна быть объявлена функция receiveMessage
:
function receiveMessage(event)
{
// do something with event.data;
}
Офлайн-iframe должен также правильно отправлять события через postMessage
:
<script>window.parent.postMessage('foo','*')</script>
Любое окно может получить доступ к этому методу в любом другом окне в любое время, независимо от местоположения документа в окне, для отправки ему сообщения. Следовательно, любой прослушиватель событий, используемый для приема сообщений, должен сначала проверить личность отправителя сообщения, используя исходные и, возможно, исходные свойства. Это нельзя недооценивать: Невозможность проверить свойства Origin
и, возможно, source
, позволяет атаковать сценарии межсайтового сценария.
Источник: https://developer.mozilla.org/en/DOM/window.postMessage