Способы обойти политику того-же-источника

Та же политика источника

Я хотел сделать общественную Wiki относительно политик того-же-источника HTML/JS, надо надеяться, помочь любому ищущему эту тему. Это - один из наиболее разыскиваемых темы на ТАК и существует не консолидированная Wiki для него, таким образом, здесь я иду :)

Та же политика источника предотвращает документ или сценарий, загруженный из одного источника от получения или установки свойств документа от другого источника. Эта политика даты полностью назад к Netscape Navigator 2.0.

Что такое некоторые Ваши любимые способы обойти политики того-же-источника?

Сохраните примеры подробными и предпочтительно также свяжите свои источники.

150
задан 3 revs, 2 users 100% 14 May 2014 в 18:20
поделиться

5 ответов

Метод document.domain

  • Тип метода: iframe.

Обратите внимание, что это метод 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

  • Тип метода: AJAX.

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/

The window.postMessage method

  • Method type: iframe.

window.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

84
ответ дан 23 November 2019 в 22:20
поделиться

Метод обратного прокси

  • Тип метода: Ajax

Настройка простого обратного прокси на сервере позволит браузеру использовать относительный пути для запросов 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 .

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

41
ответ дан 23 November 2019 в 22:20
поделиться

Я использую JSONP.

По сути, вы добавляете

<script src="http://..../someData.js?callback=some_func"/>

на свою страницу.

должен быть вызван some_func(), чтобы вы были уведомлены о том, что данные поступили.

17
ответ дан 23 November 2019 в 22:20
поделиться

Лично window.postMessage - самый надежный способ, который я нашел для современных браузеров. Вам действительно нужно проделать немного больше работы, чтобы убедиться, что вы не подвергаетесь атакам XSS, но это разумный компромисс.

Есть также несколько подключаемых модулей для популярных наборов инструментов Javascript, которые обертывают window.postMessage и предоставляют аналогичные функциональные возможности более старым браузерам с использованием других методов, описанных выше.

1
ответ дан 23 November 2019 в 22:20
поделиться

На ум приходит JSONP :

JSONP или «JSON с заполнением» - это дополнение к базовым данным JSON формат, шаблон использования, который позволяет страницу для запроса и более значимо использовать JSON с сервера, отличного от основной сервер. JSONP - это альтернатива более свежему методу называется Cross-Origin Resource Sharing.

3
ответ дан 23 November 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: