Способы обойти того же происхождения политики


та же политика происхождения

Я хотел сделать сообщество wiki в отношении HTML / JS политики того же происхождения надеюсь помочь всем, кто ищет эту тему. Это одна из самых популярных тем на SO, и для нее нет консолидированной Вики, поэтому я иду :)

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

Каковы некоторые из ваших любимых способов обойти политику того же происхождения?

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

11 150

11 ответов:

The document.domain метод

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

обратите внимание, что это метод iframe, который устанавливает значение документа.домен к суффиксу текущего домена. Если это так, то более короткий домен используется для последующих проверок происхождения. Например, предположим, что сценарий в документе по адресу 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

метод совместного использования ресурсов перекрестного происхождения

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

Кросс-Происхождения Совместное Использование Ресурсов (CORS) - это рабочий проект W3C, который определяет, как браузер и сервер должны взаимодействовать при доступе к источникам через origins. Основная идея 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 метод

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

window.postMessage, при вызове, вызывает a MessageEvent для отправки в целевом окне, когда любой ожидающий сценарий, который должен быть выполнен, завершается (например, оставшиеся обработчики событий, если window.postMessage вызывается из события обработчик, ранее установленные отложенные таймауты и т. д.). Элемент 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);

и

метод обратного прокси-сервера

  • метод типа: 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.

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

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

в принципе, можно добавить

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

на вашу страницу.

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

AnyOrigin не работал хорошо с некоторыми сайтами https, поэтому я просто написал альтернативу с открытым исходным кодом под названием whateverorigin.org это, кажется, хорошо работает с https.

код на github.

самый последний способ преодоления политики того же происхождения, которую я нашел, - это http://anyorigin.com/

сайт сделан так, что вы просто даете ему любой url-адрес, и он генерирует код javascript/jquery для вас, который позволяет вам получить html/data, независимо от его происхождения. Другими словами, он делает любой url или веб-страницу запросом JSONP.

Я нашел его очень полезным :)

вот пример кода javascript от anyorigin:

$.getJSON('http://anyorigin.com/get?url=google.com&callback=?', function(data){
    $('#output').html(data.contents);
});

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

http://www.flickr.com/photos/iluvrhinestones/5889370258/

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

JSONP или "JSON с прокладкой" - это a дополнение к базовым данным JSON формат, шаблон использования, который позволяет страница для запроса и более осмысленно используйте JSON с сервера, отличного от основной сервер. JSONP-это альтернатива более позднему методу называется совместное использование ресурсов из разных источников.

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

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

Ну, я использовал curl в PHP, чтобы обойти это. У меня есть веб-сервис, работающий в порту 82.

<?php

$curl = curl_init();
$timeout = 30;
$ret = "";
$url="http://localhost:82/put_val?val=".$_GET["val"];
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($curl, CURLOPT_MAXREDIRS, 20);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5");
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$text = curl_exec($curl);
echo $text;

?>

вот javascript, который вызывает PHP-файл

function getdata(obj1, obj2) {

    var xmlhttp;

    if (window.XMLHttpRequest)
            xmlhttp=new XMLHttpRequest();
    else
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
                document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","phpURLFile.php?eqp="+obj1+"&val="+obj2,true);
    xmlhttp.send();
}

мой HTML работает на WAMP в порту 80. Итак, мы идем, та же политика происхождения была обойдена: -)

вот некоторые обходные пути, и объяснение того же происхождения политики:
блог - браузер Thiru же политика происхождения обходной путь

Это анализировать в значительной степени то, что доступно там:http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier

для решения postMessage взгляните на:

https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js

и немного другой версия:

https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js