Способы обойти того же происхождения политики
та же политика происхождения
Я хотел сделать сообщество wiki в отношении HTML / JS политики того же происхождения надеюсь помочь всем, кто ищет эту тему. Это одна из самых популярных тем на SO, и для нее нет консолидированной Вики, поэтому я иду :)
та же политика происхождения предотвращает документ или скрипт, загруженный из одного происхождение от получения или установки свойства документа из другого документа происхождение. Эта политика датируется весь путь вернемся к Netscape Navigator 2.0.
Каковы некоторые из ваших любимых способов обойти политику того же происхождения?
пожалуйста, держите примеры подробными и желательно также связать свои источники.
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
, при вызове, вызывает aMessageEvent
для отправки в целевом окне, когда любой ожидающий сценарий, который должен быть выполнен, завершается (например, оставшиеся обработчики событий, если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.
самый последний способ преодоления политики того же происхождения, которую я нашел, - это 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); });
Я не могу претендовать на кредит для этого изображения, но он соответствует всему, что я знаю по этому вопросу и предлагает немного юмора в то же время.
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