JavaScript - window.location - Permission Denied - Межсайтовый скриптинг

Этот вопрос является более конкретным описанием проблемы, которую я задал в этой теме. По сути, у меня есть веб-приложение, для которого я пытаюсь использовать функцию Twitter OAuth. В этом приложении есть ссылка, по которой пользователю предлагается ввести учетные данные Twitter. Когда пользователь щелкает эту ссылку, открывается новое окно с помощью JavaScript. Это окно служит диалоговым окном. Когда пользователь щелкает ссылку, он перенаправляется на сайт Twitter в диалоговом окне. На сайте Twitter пользователь может ввести свои учетные данные Twitter. Когда они предоставят свои учетные данные, они будут перенаправлены обратно на страницу моего сайта в диалоговом окне. Это достигается с помощью URL-адреса обратного вызова, который может быть установлен для приложений на сайте Twitter.

Все, что я пытаюсь сделать, это прочитать URL-адрес открытого окна. Я пытаюсь прочитать URL-адрес, чтобы обнаружить изменение, чтобы я мог соответствующим образом отреагировать и записать в HTML DOM на стартовой странице. Однако всякий раз, когда я пытаюсь прочитать URL-адрес диалогового окна, я получаю сообщение об ошибке «В разрешении отказано». Чтобы изолировать и воссоздать проблему, я создал следующий тест, который показывает проблему.

<html>
  <body>
    <input type="button" value="test" onclick="startTest();" />

    <script type="text/javascript">
      var dwin = null;
      var timeoutID = 0;

      function startTest()
      {
        dwin = window.open("http://www.google.com", "dialog", "height=600,width=800", true);
        timeoutID = setTimeout("timerElapsed()", 1000);         
      }

      function timerElapsed()
      {
        if (timeoutID == 5)
    {
      clearTimeout(timeoutID);
      alert("We're done!");
    }
    else
    {               
      if (dwin != null)
      {
        alert(dwin.location);
      }             
      timeoutID = setTimeout("timerElapsed()", 1000);
    }
      }
    </script>
  </body>
</html>

Как мне получить dwin.location? Я действительно смущен. Я не думал, что это будет так сложно.

Спасибо за любую помощь, которую вы можете оказать.


person Villager    schedule 01.08.2009    source источник


Ответы (3)


Короткий ответ: у вас не получится, если вы не пересмотрите свою стратегию.

Причина проста в том, что вы открыли новое окно браузера. Пользователь может переходить по ссылкам с вашего сайта, и браузер будет нарушать конфиденциальность, если вы узнаете, на каком сайте он находится. Сами URL-адреса являются частной информацией, если они не с вашего сайта.

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

person Nicole    schedule 01.08.2009
comment
Но что, если всплывающее окно не на моем сайте? Хотя конечной страницей является мой сайт, она перенаправляется на эту страницу со страницы, которая не является моим сайтом. Нет возможности это сделать? - person Villager; 01.08.2009

Не совсем ответ на ваши вопросы, но:

  • используя всплывающее окно, вы получите какие-то ограничения / проблемы безопасности, потому что вы используете другой домен
  • в зависимости от того, как вы его открываете, всплывающее окно может быть заблокировано функциями блокировки всплывающих окон браузера.
  • всплывающие окна действительно раздражают пользователей!

Есть ли способ избежать использования всплывающих окон?


Несколько дней назад я увидел это сообщение в блоге о Twitter и OAuth: Написание простого клиента Twitter с использованием библиотеки OAuth PHP Zend Framework (Zend_Oauth)

Даже если вы не используете Zend Framework или PHP, в этом сообщении показано, что можно использовать OAuth для аутентификации в Twitter без использования всплывающих окон :-)


Почему бы просто не перенаправить вашего пользователя на страницу аутентификации Twitter (внутри окна текущего браузера), когда он щелкнет ссылку? И вернутся ли они на сайт после завершения аутентификации? Возможно, есть способ сделать это с помощью API твиттера?
На самом деле, это кажется возможным (цитирую ваш другой вопрос):

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

Проблема в том, что вы боитесь, что пользователь не вернется?
Что ж, если они нажимают на эту ссылку, это, вероятно, потому, что они хотят что-то сделать на вашем сайте, не так ли? Так что они, вероятно, вернутся!
Может быть, вы могли бы поместить пояснение рядом со ссылкой, чтобы объяснить, что она делает и как; это может помочь им понять, что отправка на страницу аутентификации в Твиттере - это нормально ;-)

person Pascal MARTIN    schedule 01.08.2009

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

person Artem Barger    schedule 01.08.2009