Я хотел сделать общественную Wiki относительно политик того-же-источника HTML/JS, надо надеяться, помочь любому ищущему эту тему. Это - один из наиболее разыскиваемых темы на ТАК и существует не консолидированная Wiki для него, таким образом, здесь я иду :)
Та же политика источника предотвращает документ или сценарий, загруженный из одного источника от получения или установки свойств документа от другого источника. Эта политика даты полностью назад к Netscape Navigator 2.0.
Сохраните примеры подробными и предпочтительно также свяжите свои источники.
document.domain
Обратите внимание, что это метод iframe, который устанавливает значение document.domain в суффикс текущего домена. Если это так, то для последующих проверок происхождения используется более короткий домен. Например, предположим, что сценарий в документе по адресу 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 Resource Sharing (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
methodwindow.postMessage
при вызове вызывает MessageEvent
, который будет отправлен в целевом окне, когда завершится любой ожидающий сценарий, который должен быть выполнен (например, оставшиеся обработчики событий, если window.postMessage
вызывается из обработчика событий, ранее установленные ожидающие таймауты и т.д.). Событие MessageEvent
имеет тип message, свойство 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. Это нельзя недооценивать: Неспособность проверить origin
и, возможно, source
свойства позволяет проводить межсайтовые скриптовые атаки.
Источник: https://developer.mozilla.org/en/DOM/window.postMessage
Настройка простого обратного прокси на сервере позволит браузеру использовать относительный пути для запросов Ajax, в то время как сервер будет действовать как прокси для любого удаленного местоположения.
При использовании mod_proxy в Apache основной конфигурационной директивой для установки обратного прокси-сервера является ProxyPass
. Обычно он используется следующим образом:
ProxyPass /ajax/ http://other-domain.com/ajax/
В этом случае браузер сможет запросить /ajax/web_service.xml
как относительный URL-адрес, но сервер будет обслуживать его, выступая в качестве прокси для http://other-domain.com/ajax/web_service.xml
.
Одна интересная особенность этого метода заключается в том, что обратный прокси-сервер может легко распределять запросы по нескольким внутренним серверам, таким образом действуя как балансировщик нагрузки .
Я использую JSONP.
По сути, вы добавляете
<script src="http://..../someData.js?callback=some_func"/>
на свою страницу.
должен быть вызван some_func(), чтобы вы были уведомлены о том, что данные поступили.
Лично window.postMessage
- самый надежный способ, который я нашел для современных браузеров. Вам действительно нужно проделать немного больше работы, чтобы убедиться, что вы не подвергаетесь атакам XSS, но это разумный компромисс.
Есть также несколько подключаемых модулей для популярных наборов инструментов Javascript, которые обертывают window.postMessage
и предоставляют аналогичные функциональные возможности более старым браузерам с использованием других методов, описанных выше.
На ум приходит JSONP :
JSONP или «JSON с заполнением» - это дополнение к базовым данным JSON формат, шаблон использования, который позволяет страницу для запроса и более значимо использовать JSON с сервера, отличного от основной сервер. JSONP - это альтернатива более свежему методу называется Cross-Origin Resource Sharing.