Та же политика происхождения
Я хотел создать вики сообщества для политик HTML / JS с тем же происхождением, чтобы, надеюсь, помочь всем, кто ищет эту тему. Это одна из самых популярных тем на SO, и для нее нет сводной вики, так что я пойду :)
Такая же политика происхождения не позволяет документу или скрипту, загруженному из одного источника, получать или задавать свойства документа из другого источника. Эта политика восходит к Netscape Navigator 2.0.
Каковы ваши любимые способы обхода политики одного и того же происхождения?
Пожалуйста, сохраняйте подробные примеры и, желательно, делайте ссылки на свои источники.
javascript
ajax
same-origin-policy
David Titarenco
источник
источник
not constructive
признак кажется совершенно бессмысленным. Проголосовал за повторное открытие.Ответы:
document.domain
методОбратите внимание, что это метод iframe, который устанавливает значение document.domain в суффикс текущего домена. Если это так, более короткий домен используется для последующих проверок происхождения. Например, предположим, что скрипт в документе at
http://store.company.com/dir/other.html
выполняет следующий оператор:После выполнения этого оператора страница пройдет проверку источника с
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
Метод совместного использования ресурсов из разных источников
Обмен ресурсами между источниками (CORS) - это рабочий проект W3C, который определяет, как браузер и сервер должны взаимодействовать при доступе к источникам из разных источников. Основная идея CORS состоит в том, чтобы использовать настраиваемые заголовки HTTP, чтобы браузер и сервер знали достаточно друг о друге, чтобы определить, будет ли запрос или ответ успешным или нет.
Для простого запроса, который использует либо
GET
илиPOST
без каких - либо специальных заголовков и чье телоtext/plain
, запрос посылается с дополнительным заголовком называетсяOrigin
. Заголовок Origin содержит источник (протокол, имя домена и порт) запрашивающей страницы, чтобы сервер мог легко определить, должен ли он обслуживать ответ.Origin
Заголовок примера может выглядеть так:Если сервер решает, что запрос должен быть разрешен, он отправляет
Access-Control-Allow-Origin
заголовок, отражающий тот же источник, который был отправлен, или,*
если это общедоступный ресурс. Например:Если этот заголовок отсутствует или происхождение не совпадает, браузер отклоняет запрос. Если все хорошо, то браузер обрабатывает запрос. Обратите внимание, что ни запросы, ни ответы не содержат информацию о файлах cookie.
В своем посте о CORS команда Mozilla предлагает проверить наличие
withCredentials
свойства, чтобы определить, поддерживает ли браузер CORS через XHR. Затем вы можете связать с существованиемXDomainRequest
объекта все браузеры:Обратите внимание, что для работы метода CORS вам необходим доступ к механике заголовков сервера любого типа, и вы не можете просто получить доступ к сторонним ресурсам.
Источник: http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/
window.postMessage
методwindow.postMessage
при вызове вызываетMessageEvent
отправку a в целевом окне, когда завершается любой ожидающий сценарий, который должен быть выполнен (например, оставшиеся обработчики событий, если онwindow.postMessage
вызывается из обработчика событий, предварительно установленные тайм-ауты ожидания и т. д.).MessageEvent
Имеет сообщение типа,data
свойство , которое устанавливается на значение строки первого аргумента , предоставленныйwindow.postMessage
,origin
свойство , соответствующее происхождение основного документа в окне вызывающегоwindow.postMessage
в то времяwindow.postMessage
называло, иsource
свойство , которое является окном , из которыйwindow.postMessage
называется.Чтобы использовать
window.postMessage
, слушатель события должен быть присоединен:И
receiveMessage
функция должна быть объявлена:Внешнее iframe также должно правильно отправлять события через
postMessage
:Любое окно может получить доступ к этому методу в любом другом окне, в любое время, независимо от местоположения документа в окне, чтобы отправить ему сообщение. Следовательно, любой прослушиватель событий, используемый для получения сообщений, должен сначала проверить личность отправителя сообщения, используя свойства источника и, возможно, источника. Это не может быть недооценено: неспособность проверить
origin
и, возможно,source
свойства включает атаки сценариев между сайтами.Источник: https://developer.mozilla.org/en/DOM/window.postMessage
источник
Access-Control-Allow-Origin: http://www.stackoverflow.com/
вместо:Access-Control-Allow-Origin: http://www.stackoverflow.com
(косая черта в конце URL), это не работает в Safari и FF, но работает в Chrome. Конечно, без слеша прекрасно работает во всех браузерах.postMessage
метод работает только для браузеров, которые его поддерживают, поскольку он является дополнением HTML5. Этот плагин пытается объяснить это. Просто упомяну это, потому что я изучаю это трудным путем.Метод обратного прокси
Настройка простого обратного прокси на сервере позволит браузеру использовать относительные пути для запросов Ajax, в то время как сервер будет действовать как прокси для любого удаленного местоположения.
При использовании mod_proxy в Apache основной директивой конфигурации для настройки обратного прокси является
ProxyPass
. Обычно используется следующим образом:В этом случае браузер сможет запрашивать
/ajax/web_service.xml
относительный URL-адрес, но сервер будет выполнять эту функцию, выступая в качестве прокси дляhttp://other-domain.com/ajax/web_service.xml
.Одна интересная особенность этого метода заключается в том, что обратный прокси-сервер может легко распределять запросы по нескольким серверам, выступая в качестве балансировщика нагрузки .
источник
Я использую JSONP.
В основном, вы добавляете
на твоей странице.
some_func () должен быть вызван так, чтобы вы были уведомлены, что данные находятся в.
источник
AnyOrigin плохо работал с некоторыми сайтами https, поэтому я просто написал альтернативу с открытым исходным кодом whatorigin.org, которая, кажется, хорошо работает с https.
Код на github .
источник
Самый последний способ преодоления той же политики происхождения, которую я нашел, это http://anyorigin.com/
Сайт сделан так, что вы просто даете ему любой URL, и он генерирует код javascript / jquery для вас, который позволяет вам получать html / data, независимо от его происхождения. Другими словами, он делает любой URL или веб-страницу запросом JSONP.
Я нашел это довольно полезным :)
Вот несколько примеров кода javascript из anyorigin:
источник
Я не могу претендовать на кредит за это изображение, но оно соответствует всему, что я знаю по этому вопросу, и в то же время предлагает немного юмора.
http://www.flickr.com/photos/iluvrhinestones/5889370258/
источник
На ум приходит JSONP :
источник
Лично,
window.postMessage
это самый надежный способ, который я нашел для современных браузеров. Вы должны сделать немного больше работы, чтобы убедиться, что вы не оставляете себя открытым для атак XSS, но это разумный компромисс.Есть также несколько плагинов для популярных наборов инструментов Javascript, которые обертывают,
window.postMessage
которые предоставляют аналогичную функциональность для старых браузеров, используя другие методы, описанные выше.источник
Ну, я использовал curl в PHP, чтобы обойти это. У меня есть веб-сервис, работающий в порту 82.
Вот JavaScript, который делает вызов файла PHP
Мой 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
источник