YouTube embed: niebezpieczne JavaScript próba dostępu do ramki

Mamy aplikację Wicket ze stroną zawierającą osadzony film z Youtube. Wideo osadza się i odtwarza dobrze, ale najwyraźniej powoduje, że reszta strony nie renderuje - wydaje się, że elementy DOM pochodzące po osadzenie po prostu nie pojawiają się na stronie, mimo że są w znacznikach.

Patrząc na konsolę błędów w Chrome ujawnia:

Unsafe JavaScript attempt to access ramka z adresem URL http://example.com/detail/COMMUNICATION/search/com-sonyericsson-hanashi from frame with URL http://www.youtube.com/embed/eJY7_De5opI?enablejsapi=1&autohide=1&showinfo=1 . Domeny, protokoły i porty muszą mecz.

Wygooglowałem to sporo, a ludzie wydają się mówić, że to nieszkodliwe i ignorować to. To po prostu wydaje się złe, a w naszym przypadku faktycznie łamie stronę.

Jeśli zmienimy naszą aplikację tak, aby film był osadzone dynamicznie poprzez wywołanie zwrotne ajax (użytkownik klika Wicket AjaxLink) nadal otrzymujemy błąd w konsoli, ale przynajmniej strona renderuje się w pełni. Niestety to nie zadziała, ponieważ musimy domyślnie załadować wideo, gdy użytkownik pierwszy raz wejdzie na stronę.

Edit: powinienem dodać, że chociaż komunikat o błędzie został pobrany z konsoli Chrome, błąd wydaje się wpływać na każdą przeglądarkę, którą próbowałem: Chrome, Safari i Firefox.

Author: Community, 2011-06-14

5 answers

Błąd bezpieczeństwa jest mało prawdopodobne, aby złamać stronę. Wygląda na to, że błąd dzieje się z ramki YouTube, co oznacza, że w najgorszym przypadku zawartość ramki będzie pomieszana.

Ramka / ramka iframe ze strony zewnętrznej nie może w żadnym wypadku wpływać na zawartość dokumentu nadrzędnego, chyba że pochodzą z tej samej domeny i numeru portu. Jest to jedna z twardych zasad bezpieczeństwa przeglądarki.

Błąd musi znajdować się gdzie indziej w znacznikach. Każda szansa na widzisz jakiś przykładowy znacznik?

[edytuj]

Błąd może być również w znacznikach kodu osadzania. Lub, jeśli jakiekolwiek znaczniki skryptu są dołączone bezpośrednio na stronie (nie w ramce iframe), może tam być.

Zazwyczaj, gdy zdarzają się takie problemy, to jest to spowodowane nieodkrytym tagiem, ale może to być również Javascript.

 24
Author: Andrew Curioso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-14 15:48:42

Jeśli masz problem z rozwiązaniem tego błędu JavaScript, możesz spróbować użyć starego kodu osadzania YouTube. Jest to opcja na każdym filmie YouTube po kliknięciu na osadzenie. Nie będziesz miał tego błędu, ponieważ nie używa ramek iframes. Kod wyglądałby mniej więcej tak:

<object width="560" height="315">
    <param name="movie" value="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0"></param>
    <param name="allowFullScreen" value="true"></param>
    <param name="allowscriptaccess" value="always"></param>
    <embed src="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed>
</object>
Mam nadzieję, że to pomoże.
 7
Author: Jonathan Torres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-20 20:48:55

Głosowałem za odpowiedzią Jonathana Torresa, ponieważ jego kod zatrzymał Ostrzeżenia Javascript. Jednak potem odkryłem błędy, gdy zatwierdziłem kod.

Więc moja odpowiedź jest taka...

Zaznacz pole wyboru "Użyj starego kodu osadzania" podczas korzystania z kodu osadzania YouTube, aby nie używać ramki iframe.

Aby Kod był poprawny musisz dodać....

type="movie"

I

data="http://SAME YOUTUBE URL USED IN THE FIRST PARAM ELEMENT/"

Do elementu OBJECT . Następnie utwórz param elementy samozamykające się (ale nie element EMBED ).

To powinno sprawić, że Twój kod YouTube będzie wyglądał tak...

<object width="560" height="315" type="movie" data="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0">
<param name="movie" value="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0"></param><param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<embed src="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed>
</object>

Nie powinieneś otrzymywać żadnych ostrzeżeń Javascript, a Twój kod powinien zostać zweryfikowany.

 5
Author: adriandhart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-24 12:46:37

Błąd Unsafe JavaScript attempt to access frame nie ma nic wspólnego z renderowaniem strony. Uszkodzone znaczniki (np. brakujące </iframe>) są najbardziej prawdopodobną przyczyną.

Jeśli chodzi o BłądUnsafe JavaScript attempt to access frame, masz kilka opcji:

  1. Najprostszym rozwiązaniem jest użycie IFrame Player API zamiast ręcznego dodawania tagów iframe. API jest częścią JavaScript, który generuje znacznik iframe dla Ciebie i dodaje parametry, które wyeliminują (lub powinny) Błąd dostępu do ramki. Oto instrukcja użycia IFrame Player API do załadowania odtwarzacza.

  2. Ręcznym rozwiązaniem jest zbudowanie znaczników <iframe> i dołączenie parametru &origin=http://example.com do adresów URL. Cytat:

Jako dodatkowy środek bezpieczeństwa, należy również podać pochodzenie parametr do adresu URL, określający schemat adresu URL (http: / / lub https://) i pełną domenę swojej strony hostingowej jako wartość parametru. While origin jest opcjonalne, w tym chroni przed złośliwymi osobami trzecimi JavaScript jest wstrzykiwany na Twoją stronę i przejmuje kontrolę nad twoją Odtwarzacz YouTube.

 2
Author: Salman A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-17 11:05:06

Dla mnie to działało używając kodu tutaj: https://developers.google.com/youtube/iframe_api_reference#Loading_a_Video_Player

Linie, które naprawiłem, widzą słowa z 2 asteriksem * * kod :

Z tego:

var tag = document.createElement('script');
          tag.src = "**http://www.youtube.com/player_api**";
          var firstScriptTag = document.getElementsByTagName('script')[0];
          firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
          var players = new Array();
          function **onYouTubePlayerAPIReady()** {

        var ids = $('div.video div');

        for(var i=0; i < ids.length; i++) {
            players.push(new YT.Player('**yt**'+i, {
                height: '400',
                width: '596',
                videoId: $(ids[i]).attr('rel'),
                events: {
                    'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
                }
            }));
        }

      }

Do tego:

var tag = document.createElement('script');
  tag.src = "**https://www.youtube.com/iframe_api**";
  var firstScriptTag = document.getElementsByTagName('script')[0];
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
  var players = new Array();
  function **onYouTubeIframeAPIReady()** {

    var ids = $('div.video div');

    for(var i=0; i < ids.length; i++) {
        players.push(new YT.Player('**player**'+i, {
            height: '400',
            width: '596',
            videoId: $(ids[i]).attr('rel'),
            events: {
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            }
        }));
    }

  }
 0
Author: pachermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-14 15:14:43