JavaScript - window.location - отказано в доступе - межсайтовый скриптинг - PullRequest
0 голосов
/ 01 августа 2009

Этот вопрос является более конкретным описанием проблемы, которую я задал в этой теме . По сути, у меня есть веб-приложение, для которого я пытаюсь использовать функцию OAuth в Twitter. Это приложение имеет ссылку, которая запрашивает у пользователя учетные данные 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? Я действительно смущен. Я не думал, что это будет так сложно.

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

Ответы [ 3 ]

1 голос
/ 01 августа 2009

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

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

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

1 голос
/ 01 августа 2009

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

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

Нет ли способа избежать всплывающего окна?


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

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


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

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

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

0 голосов
/ 01 августа 2009

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

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