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
Метод перехресного походження ресурсів
Перехресний розподіл ресурсів (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
метод
window.postMessage
, при виклику викликає 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);
І receiveMessage
функція повинна бути оголошена:
function receiveMessage(event)
{
// do something with event.data;
}
Поза межаним сайтом iframe також повинен належним чином надсилати події через postMessage
:
<script>window.parent.postMessage('foo','*')</script>
Будь-яке вікно може отримати доступ до цього методу в будь-якому іншому вікні, в будь-який час, незалежно від розташування документа у вікні, щоб надіслати йому повідомлення. Отже, будь-який слухач подій, який використовується для отримання повідомлень, спочатку повинен перевірити особу відправника повідомлення, використовуючи походження та, можливо, властивості джерела. Цього не можна занижувати: Якщо не перевірити origin
та, можливо, source
властивості, вмикаються міжсайтові сценарії.
Джерело: https://developer.mozilla.org/en/DOM/window.postMessage