Atrybut iFrame sandbox blokuje wywołania AJAX
Mam aplikację (http://localhost/MyApp
), w której niektóre części są renderowane przez ramki iFrame. Te części iframed nie mają nic wspólnego z resztą Dom aplikacji, więc zastosowałem atrybut sandbox
.
IFRAME jest zadeklarowany w następujący sposób:
<iframe src="/MyApp/en/html/action?id=1" sandbox="allow-forms allow-scripts" seamless="seamless"></iframe>
Strona iframed ma przycisk, który wykonuje wywołanie AJAX do tej samej aplikacji internetowej, ale zamiast HTTP GET
, przeglądarka wydaje HTTP OPTIONS
, który pojawia się jako Cancelled
, i pojawia się błąd:
XMLHttpRequest cannot load http://localhost/MyApp/en/data/action?id=1. Cannot make any requests from null.
Ajax State 0 Error: HTTP 0
Jeśli dodam allow-same-origin
do atrybut sandbox
, to works.As o ile czytałem tutaj , nie miało to wpływać na połączenia AJAX.
Dlaczego to się dzieje? Czy rozważenie ścieżki /MyApp/en/html/action
jako pochodzenia całego IFRAME i blokowanie żądania do poprzednich poziomów?
1 answers
Ajax ma wpływ na Ajax, ponieważ Ajax jest regulowany przez Same zasady pochodzenia Zasady, a kiedy sandbox to skutecznie mówisz przeglądarce, aby traktowała zawartość iframe
tak, jakby była z innego pochodzenia. Cytując ten sam Artykuł :
- unikalna obróbka pochodzenia. Cała zawartość jest traktowana pod unikalnym pochodzeniem. Treść nie jest w stanie przejść przez DOM ani odczytać informacji o plikach cookie.
Oznacza to, że nawet zawartość pochodząca z tej samej domeny jest traktowana z zasadą cross-domain, ponieważ każda zawartość IFRAME będzie postrzegana jako unikalne pochodzenie.
Zawartość osadzona jest dozwolona tylko do wyświetlania informacji.Nie można wykonać żadnych innych działań wewnątrz iframe , które mogłyby zagrozić stronie hostingowej lub wykorzystać zaufanie użytkowników.
Innymi słowy, jeśli pominiesz allow-same-origin
w atrybucie sandbox
, będzie on traktował stronę z piaskownicy jako należy do innej domeny (w rzeczywistości będzie traktowana jako posiadająca null
pochodzenie). Ponieważ nie ma sensu wysyłanie żądań Ajax do null
, strony z piaskownicą nie mogą w ogóle wykonywać wywołań Ajax (jeśli zezwala się na wykonywanie ich do localhost
, byłyby one nieodróżnialne od wywołań ze strony nadrzędnej, co nie pozwala na piaskownicę).
Dodatkowe informacje
Jeśli spróbujesz wykonać połączenie Ajax do innej domeny, to oczywiście się nie powiedzie:]}<script src="http://code.jquery.com/jquery.min.js"></script>
<script>
console.log(location.host);
$.post('https://google.com/',{},function() { });
</script>
Jednakże, Jak to się nie powiedzie zależy od użytego atrybutu piaskownicy. Jeśli umieścisz powyższą stronę w iframe
z allow-same-origin
, wydrukuje to na konsoli:
localhost
XMLHttpRequest cannot load https://google.com/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
...i jeśli umieścisz go bez allow-same-origin
:
localhost
XMLHttpRequest cannot load https://google.com/. Cannot make any requests from null.
Zauważ, że podczas gdy oba zgłaszały location.host
jako localhost
, jeden uważał pochodzenie za http://localhost
, a drugi za null
(pokazując ten sam komunikat o błędzie, którego doświadczyłeś w swoim przykładzie).
Rozumowanie
Dlaczego tak jest ważne, aby blokować połączenia Ajax z zawartości piaskownicy z tej samej domeny? Jak wyjaśniono w artykule:
To ma sens, że treści na tej samej domenie powinny być bezpieczne. Ryzyko w tym przypadku wynika przede wszystkim z Treści Generowanych przez użytkowników, które są ponownie hostowane w IFRAME .
Zróbmy przykład: załóżmy, że Facebook zdecyduje się zezwolić użytkownikom na umieszczanie małych animacji HTML5 na swoich stronach. Przechowuje je we własnych serwerach, a gdy wyświetlanie, sandboxy są tylko allow-scripts
(ponieważ skrypty są potrzebne do działania animacji), ale pozostawia Wszystko inne zabronione (w szczególności allow-same-origin
, ponieważ nie chcesz, aby kod użytkownika mieszał się ze stroną nadrzędną). Co by się stało, gdyby połączenia Ajax nie były domyślnie blokowane?
Wykonanie połączenia Ajax do Facebook, przy użyciu jego API (powiedzmy, Open Graph ); serwer z radością przyjmie połączenie, ponieważ z tego, co wie, Prośba pochodziła ze strony z
https://facebook.com
jako origin.Utwórz URI wskazujące na jej własny serwer, ze zwracanymi danymi jako ciągami zapytań i ustaw go jako
src
obrazu na stronie piaskownicy.
Połączenie Ajax działa w przeglądarce Alice, podczas gdy Alice jest zalogowana; ponieważ serwer nie wie, skąd połączenie pochodzi (Strona główna lub osadzona strona) zrobi wszystko, o co poprosi - w tym pobranie danych osobowych.
Gdy element
img
zostanie utworzony z URI Mallory, przeglądarka spróbuje normalnie załadować "obraz", ponieważ obrazy są wyłączone z tej samej polityki pochodzenia.Ponieważ URI ma prywatne informacje Alice w łańcuchu zapytań, serwer Mallory może po prostu zapisać je i zwrócić dowolny obraz. Teraz Mallory ma dane osobowe Alice, a Alice nic nie podejrzewa.
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-02-01 12:14:27