Как политика того же домена работает для всплывающих окон, когда URL-адрес настроен для запуска JavaScript? - PullRequest
6 голосов
/ 10 ноября 2010

Я хочу сделать что-то вроде этого:

var w = window.open("javascript: makeAnAjaxRequest();");

Мой вопрос: будет ли Ajax-запрос (исполняемый после открытия нового окна) рассматриваться как межсайтовый? Применима ли политика того же домена к исходному домену, на странице которого создано окно?

В связи с некоторыми вашими комментариями:

someAjaxFunction() просто должен сделать запрос Ajax и иметь возможность работать с результатом. Я понимаю, что функция должна быть определена в окне, которое я открываю. Нет проблем; У меня есть миниатюрная функция ajax, которую я использую, и которую я тоже могу вставить в URL. Дело в том, чтобы увидеть, каковы ограничения запроса; то есть, к какому домену будет применяться политика того же домена?

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

Некоторая информация от Google: http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_DOM_access

Без дополнительных квалификаторов термин «политика одного и того же происхождения» чаще всего относится к механизму, который определяет способность JavaScript и других языков сценариевполучить доступ к свойствам и методам DOM через домены (ссылка).По сути, модель сводится к этому трехэтапному процессу принятия решения:

Если протокол, имя хоста и - для браузеров, отличных от Microsoft Internet Explorer - номер порта для двух взаимодействующих страниц совпадают, доступ предоставляется бездальнейшие проверки.Любая страница может установить для параметра document.domain правый, полностью определенный фрагмент своего текущего имени хоста (например, foo.bar.example.com может установить для него значение example.com, но не ample.com).Если две страницы явно и взаимно устанавливают для своих соответствующих параметров document.domain одно и то же значение, а оставшиеся проверки того же источника выполняются, доступ предоставляется.Если ни одно из указанных выше условий не выполнено, доступ запрещен.

Информация от Mozilla

Я не могу получить доступ к свойствамновое вторичное окно.Я всегда получаю сообщение об ошибке в консоли javascript, в котором говорится: «Ошибка: необработанное исключение: в доступе отказано в доступе. Почему это так?

Это связано с ограничением безопасности междоменного сценария (также называется«Та же политика происхождения»). Сценарий, загруженный в окно (или фрейм) из другого источника (доменного имени), не может ни получить, ни установить свойства другого окна (или фрейма) или свойства любого из его HTML-объектов, поступающих из другогоразличное происхождение (доменное имя). Поэтому перед выполнением сценария, нацеленного на вторичное окно, браузер в главном окне проверит, что вторичное окно имеет то же доменное имя. Подробнее о ограничении безопасности междоменного сценария: http://www.mozilla.org/projects/secu...me-origin.html

Итак, ваш ответ

  1. Итак, если протокол, имя хоста и порт совпадают для всех браузеров, кроме IE, это один и тот же домен
  2. Если протокол и имя хоста совпадают для IE, это тот же домен

В противном случае вы ограниченыicted.

РЕДАКТИРОВАТЬ - реальный ответ

window.open('javascript:doFunction()') не будет ничего делать, кроме открытия нового пустого окна, которое ничего не делает, потому что doFunction не определено.Он должен быть определен в том же окне.

Sidenote Я могу сделать запрос xhr того же источника, вставив ajax в URL-адрес напрямую, но он все еще чувствителен к тому же доменуpolicy.

x = window.open('javascript:x = new XMLHttpRequest; x.open("GET", "http://medero.org", false); x.onreadystatechange = function(){ if ( x.readyState != 4 ) { return; }; alert(x); alert( x.responseText );}; try {x.send(null); } catch (e) { alert(e)}; alert("ok"); ');

Сбой в Firefox.И я еще не проверял это в MSIE.Но

Тесты:

( сбой ) Chrome 7 (консоль) от http://stackoverflow.com:80

>>> x = window.open('http://google.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
TypeError: Cannot read property 'body' of undefined

( успех ) Chrome 7 (консоль) из http://stackoverflow.com:80

>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
"test"

( сбой ) Firefox 3.6 (консоль) из http://stackoverflow.com:80

>>> x = window.open('http://google.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
Permission denied for <http://stackoverflow.com> to get property Window.document from <http://www.google.com>.

( успех ) Firefox 3.6 (консоль) с http://stackoverflow.com:80

>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300')
>>> x.document.body.innerHTML='test';
"test"

( сбой ) Firefox 3.6 (консоль) с http://stackoverflow.com:80

$.ajax({
   url:'http://bing.com',
   success:function(data) {
      alert(data) // blank alert
   }
})

( success ) Firefox 3.6 (консоль) из http://stackoverflow.com:80

$.ajax({
   url:'http://stackoverflow.com',
   success:function(data) {
      alert(data) // success
   }
})
0 голосов
/ 10 ноября 2010

Новое окно открывается как about: blank, а затем запускает JavaScript в контексте этого окна.Выполнение AJAX-запросов из этого окна, согласно комментариям meder, будет неудачным, потому что протокол не совпадает, поэтому вы не сможете открыть соединение с любым http: url.

Ваш вопрос может быть улучшен, еслиВы упоминаете, что вы действительно пытаетесь сделать, а не просто любопытствовать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...