Niebezpieczna próba uzyskania dostępu do ramki z adresem URL przez JavaScript

112

Otrzymuję poniższy błąd, gdy próbuję ustawić wartość skrótu na nadrzędny adres URL z elementu iframe, który zawiera inny adres URL domeny:

Niebezpieczna próba uzyskania dostępu do ramki z adresem URL „URL1” z ramki z adresem URL „URL2” przez niezabezpieczony kod JavaScript. Domeny, protokoły i porty muszą być zgodne.

Jak mogę rozwiązać ten problem?

Atul
źródło
3
Dodaj więcej szczegółów, fragmenty kodu, komunikat o błędzie, używany framework .. Więcej gadatliwości, więcej szczegółów ..
fifigyuri
5
A co z sytuacją, gdy zaimplementujesz wtyczki społecznościowe G + 1, Facebook lub Shre i Twitter, które ładują się w ramkach iframe i generują ten sam błąd?
Pytanie brzmi, DLACZEGO skrypty Facebooka i Google próbują uzyskać dostęp do elementów mojej witryny.
sergio

Odpowiedzi:

124

Z dokumentu podrzędnego innego pochodzenia nie masz dostępu do właściwości okna górnego location.hash, ale możesz ustawić locationsamą właściwość.

Oznacza to, że biorąc pod uwagę, że górna lokalizacja okna jest http://example.com/page/, zamiast robić

parent.location.hash = "#foobar";

musisz znać lokalizację rodziców i to zrobić

parent.location = "http://example.com/page/#foobar";

Ponieważ zasób nie jest nawigowany, będzie to działać zgodnie z oczekiwaniami, zmieniając tylko część z krzyżykiem adresu URL.

Jeśli używasz tego do komunikacji między domenami, polecam zamiast tego użyć easyXDM .

Sean Kinsey
źródło
13
Nikt nie oznaczył tego jako odpowiedź, a mimo to ma 60 głosów za. Powinna być za to odznaka.
zachzurn
35
Jak nazywałaby się ta odznaka? „Odpowiedział leniwej osobie”
nzifnab
1
Hej @atul, bądź uprzejmy i oznacz tę odpowiedź jako najlepszą. Szanuj konwencje, które pozwalają nam wszystkim korzystać z wiedzy innych ...
Clint Eastwood
13

Crossframe-Scripting nie jest możliwy, gdy dwie ramki mają różne domeny -> Security.

Zobacz: http://javascript.about.com/od/reference/a/frame3.htm

Teraz, aby odpowiedzieć na twoje pytanie: nie ma rozwiązania lub obejścia, po prostu powinieneś sprawdzić projekt swojej witryny, dlaczego muszą istnieć dwie ramki z różnych domen, które zmieniają adres URL drugiej.

EvilMM
źródło
82
Jest to częsty wymóg, gdy ktoś osadza aplikację innej firmy w swojej witrynie, zwłaszcza gdy usługi internetowe i tym podobne nie są dostępne.
Jacques
9

Otrzymałem ten sam komunikat o błędzie, gdy próbowałem sfazować domenę dla iframe.src.

Dla mnie odpowiedzią była zmiana iframe.src na adres URL w SAMEJ domenie, ale w rzeczywistości był to przekierowanie strony HTML do żądanej domeny. Druga domena pojawiła się wtedy w moim iframe bez żadnych błędów.

Działał jak urok. :)

Tommy
źródło
czy mógłbyś dokładniej opisać to, co tutaj zrobiłeś?
Devin G Rhode,
byłoby naprawdę pomocne, gdybyś mógł krótko wyjaśnić.
Madhusudhan
2
Nie działa w najnowszej wersji Chrome: nie sprawdza parametru src, ale wczytany jest rzeczywisty adres URL. Więc sztuczka z przekierowaniem niestety nie pomaga w żaden sposób :-(
lucaferrario
3
Uważam, że Tommy ma na myśli serwer proxy po stronie serwera. Zobacz np. Benalman.com/projects/php-simple-proxy lub developer.yahoo.com/javascript/howto-proxy.html lub google.com/… lub rozwiązanie René de Kat na stackoverflow.com/a/11224975/27938
Oskar Austegard
To fajne. Ale to tylko pokazuje, jak ogólnie rzecz biorąc, obejście tego jest trywialne. OK, załóżmy, że jestem złym złośliwym hakerem i chcę przeprowadzać ataki skryptowe między domenami. Są szanse, że będę wiedzieć o tych narzędziach i ich używać. Jeśli chodzi o poprawki bezpieczeństwa przeglądarki, jest to tak samo opóźnione, jak IE, które nie pozwalają na lokalne uruchamianie Javascript bez ostrzeżenia. Nie rozwiązuje problemu. Tworzy kilka nowych.
Yitzhak
6

Rozwiązaniem mogłoby być użycie lokalnego pliku, który pobiera zdalną zawartość

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


źródło
1
Otwiera to drzwi dla luk w zabezpieczeniach skryptów między witrynami. Przykład możliwego ataku: 1. Tworzę stronę na myevilserver.com, która wygląda tak samo jak Twoja witryna, w tym formularz logowania, który POST przesyła z powrotem do myevilserver.com 2. Wysyłam użytkownikom fałszywy biuletyn z linkiem do https: // twojawitryna.com/remoteInclude.php?url=myevilserver.com 3. Widzą formularz logowania w Twojej witrynie, który przechwytuję na swoim serwerze.
EricP,
2
Możliwym rozwiązaniem jest sprawienie, by plik remoteInclude.php sprawdzał wszystkie adresy URL z wstępnie zatwierdzoną listą domen.
EricP,
Nie rozwiązuje to problemów związanych z podatnością na cross-site scripting. Nie ma absolutnie nic, co mogę zrobić z Javascriptem na zewnętrznej stronie internetowej, czego nie mogę zrobić po stronie serwera. Wszystko to utrudnia działanie samej przeglądarki i sprawia, że ​​aplikacje internetowe są mniej przydatne, wprowadzając dodatkowy krok. Nadal możesz robić to wszystko, jeśli ładujesz przez Ajax, przepisujesz linki i wysyłasz z powrotem. Jeśli to nie zadziała, zdalnie uruchom go przez php lub dowolny inny język. To absurd, że jest to problem nawet dla przeciętnego programisty.
Yitzhak
3

Zauważyłem, że użycie wersji XFBML przycisku „Lubię to” na Facebooku zamiast wersji HTML5 rozwiązało ten problem. Dodaj poniższy kod w miejscu, w którym ma się pojawić przycisk:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

Następnie dodaj to do swojego tagu HTML:

 xmlns:fb="http://ogp.me/ns/fb#"
Luke Alderton
źródło
2
Co Facebook ma wspólnego z tym pytaniem?
Kukks
16
Ponieważ pojawia się ten błąd również na przyciskach Facebooka, a ja znalazłem tę stronę podczas wyszukiwania odpowiedzi, więc pomyślałem, że inni mogą potrzebować odpowiedzi.
Luke Alderton
1

Problem polega na tym, że nawet jeśli utworzysz serwer proxy lub załadujesz zawartość i wstrzykniesz ją tak, jakby była lokalna, wszelkie skrypty, które definiuje ta zawartość, zostaną załadowane z innej domeny i spowodują problemy między domenami.

user2345833
źródło