Dlaczego Ajax między domenami jest problemem bezpieczeństwa?
Dlaczego zdecydowano, że używanie XMLHTTPRequest do wykonywania wywołań XML nie powinno odbywać się poza granicami domeny? Możesz pobrać JavaScript, obrazy, CSS, ramki iframes i prawie każdą inną zawartość, jaką mogę wymyślić z innych domen. Dlaczego żądania HTTP Ajax nie mogą przekraczać granic domeny? Wydaje się, że dziwne ograniczenie, biorąc pod uwagę, że jedynym sposobem, w jaki mogłem zobaczyć, że jest nadużywany, byłoby, gdyby ktoś wstrzyknął Javascript na stronę. Jednak w w tym przypadku możesz po prostu dodać element img, skrypt lub element iframe do dokumentu, aby poprosić o adres URL strony trzeciej i wysłać go na serwer.
[edytuj]
Niektóre z odpowiedzi wskazują na następujące powody, wskażmy powody, dla których nie tworzą one głównego powodu, aby temu zapobiec.
XSRF (Cross Site Request Forgery, znany również jako CSRF, XSRF)Twój może wykonywać ataki XSRF bez użycia tego w ogóle. Ogólnie Rzecz Biorąc, XMLHTTPRequest nie jest używany w ogóle, po prostu dlatego, że tak trudno jest zrobić XMLHTTPRequest w sposób zgodny ze wszystkimi głównymi przeglądarkami. O wiele łatwiej jest po prostu dodać tag img do adresu URL, jeśli chcesz, aby załadował Twój adres URL.
Publikowanie na stronie trzeciej
<script type="text/javascript">
$.post("http://some-bank.com/transfer-money.php",
{ amount: "10000", to_account: "xxxx" })
</script>
Można osiągnąć za pomocą
<body onload="document.getElementById('InvisbleForm').submit()"
<div style="display:none">
<form id="InvisbleForm" action="http://some-bank.com/transfer-money.php" method="POST">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="to_account" value="xxxxx">
</form>
</div>
</body>
JPunyon: dlaczego zostawiasz lukę w nowej funkcji
Nie tworzysz więcej niepewności. Jesteś po prostu niewygodne deweloperów, którzy chcą używać go w sposób dla dobrze. Każdy, kto chce użyć tej funkcji dla zła (aka awesome), może po prostu użyć innej metody.Podsumowanie
Zaznaczam odpowiedź z bobince jako poprawną, ponieważ wskazał krytyczny problem. Ponieważ XMLHTTPRequest pozwala na publikowanie, z poświadczeniami (ciasteczkami) do witryny docelowej, i odczytywanie danych wysyłanych z powrotem ze strony, wraz z wysyłaniem poświadczeń osób, można zaaranżować trochę javascript, który przesłałby serię formularzy, w tym formularzy potwierdzających, wraz z dowolnymi wygenerowanymi losowo kluczami, które zostały wprowadzone, aby zapobiec XSRF. W ten sposób możesz przeglądać witrynę docelową, jak bank, a serwer internetowy banku nie byłby w stanie powiedzieć, że nie był to zwykły użytkownik przesyłający wszystkie te formularze.
9 answers
Dlaczego żądania HTTP Ajax nie mogą przekraczać granic domen.
Ponieważ żądania AJAX są (a) przesyłane z poświadczeniami użytkownika i (b) pozwalają wywołującemu odczytać zwrócone dane.
Jest to kombinacja tych czynników, które mogą spowodować podatność. Istnieją propozycje dodania formy cross-domain AJAX, która pomija poświadczenia użytkownika.
Możesz po prostu dodać img, skrypt lub element iframe do dokumentu
Brak metody te pozwalają wywoływaczowi odczytać zwrócone dane.
(z wyjątkiem skryptów, w których jest to celowo ustawione, aby na to pozwolić, dla dozwolonego skryptowania między domenami - lub gdzie ktoś zrobił straszną fuck-up.)
To nie jest atak XSS. To cross-site request forgery attack (XSRF). Znane są sposoby rozwiązywania ataków XSRF, takie jak jednorazowe lub tokeny kryptograficzne w celu sprawdzenia, czy zgłoszenie pochodzi celowo od użytkownika i nie zostało uruchomione z kodu atakującego.Twój może wykonywać ataki XSS bez używania tego w ogóle. Publikowanie na stronie trzeciej
Jeśli zezwalasz na cross-domain AJAX, stracisz to zabezpieczenie. Atakujący kod mógł zażądać strony ze strony bankowej, odczytać na niej wszelkie tokeny autoryzacyjne i przesłać je w drugim żądaniu AJAX w celu wykonania przelewu. I to byłoby atakowaniem skryptów.
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
2009-01-21 20:53:22
Ważna różnica między postem:
<body onload="document.getElementById('InvisbleForm').submit()" ...
A Ajax polega na tym, że po wykonaniu dowolnego postu przeglądarka zastąpi stronę, a po wywołaniu Ajax-nie. Wynik postu będzie:
- wyraźnie widoczne dla użytkownika.
- atak zostanie zablokowany w tym momencie, ponieważ strona odpowiedzi z
my-bank.com
przejmie kontrolę. Żaden bank nie wdroży one-click-transfer .
Scenariusz XSRF, gdyby cross domain Ajax być dozwolone, będzie wyglądać następująco:
- użytkownik odwiedza
www.bad-guy.com
. - Jeśli nie ma otwartej strony
my-bank.com
w innej instancji przeglądarki, atak zakończy się niepowodzeniem. - ale jeśli taka strona jest otwarta, a użytkownik wprowadził już swoją nazwę użytkownika/hasło, oznacza to, że w pamięci podręcznej przeglądarki znajduje się plik cookie dla tej sesji.
- kod JavaScript na stronie z
www.bad-guy.com
wywołuje Ajax domy-bank.com
. - dla przeglądarki jest to zwykły Połączenie HTTP, musi wysłać ciasteczka my-bank do
my-bank.com
i wysyła je. - Bank przetwarza to żądanie, ponieważ nie może odróżnić tego wywołania od zwykłej aktywności użytkownika.
- fakt, że kod JavaScript może odczytać odpowiedź, nie jest ważny. W przypadku ataku może to nie być konieczne. Naprawdę ważne jest to, że użytkownik przed komputerem nie będzie miał pojęcia, że ta interakcja ma miejsce. Obejrzy ładne zdjęcia na
www.bad-guy.com
strona. - kod JavaScript wykonuje kilka innych wywołań do
my-bank.com
, jeśli jest to konieczne.
Chodzi o to, że nie ma potrzeby wstrzykiwania ani manipulowania stroną.
Lepszym rozwiązaniem może być umożliwienie połączenia, ale nie wysyłanie plików cookie. Jest to bardzo proste rozwiązanie, które nie wymaga rozległego rozwoju. W wielu przypadkach połączenie Ajax trafia do niezabezpieczonej lokalizacji i nie wysyłanie plików cookie nie będzie ograniczeniem.
CORS (Cross Origin Resource Sharing) to jest obecnie dyskutowane, między innymi, mówi o wysyłaniu / nie wysyłanie plików cookie.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
2014-11-24 08:43:59
Cóż, najwyraźniej nie jesteś jedyną osobą, która tak myśli...
Http://www.google.com/search?q=xmlhttp + cross + site
EDIT: jest ciekawa dyskusja linkowana z powyższego wyszukiwania:
Http://blogs.msdn.com/ie/archive/2008/06/23/securing-cross-site-xmlhttprequest.aspx
Wygląda na to, że trwają prace nad propozycjami zezwalającymi na cross site XMLHTTP requests (IE 8, FF3 itp.), chociaż szkoda, że nie było ich tam, gdy pisałem kod dla moich stron :) I jest jeszcze problem kompatybilności... Minie trochę czasu, zanim będzie wszechobecny.
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
2009-01-21 20:11:41
Kiedy wysyłasz żądanie HTTP do serwera, pliki cookie ustawione przez serwer są również wysyłane z powrotem przez przeglądarkę do serwera. Serwer wykorzystuje te pliki cookie, aby ustalić, że użytkownik jest zalogowany, itp.
Może to być wykorzystane przez złośliwego napastnika, który za pomocą JavaScript może ukraść informacje lub wykonać nieautoryzowane polecenia na innych stronach internetowych bez wiedzy użytkownika o tym.
Na przykład, można poprosić Użytkownika o odwiedzenie strony, która posiada następujący kod JavaScript (zakładając jQuery):
<script type="text/javascript">
$.post("http://some-bank.com/transfer-money.php",
{ amount: "10000", to_account: "xxxx" })
</script>
Teraz, jeśli użytkownik był naprawdę zalogowany do banku podczas wykonywania powyższego kodu, atakujący mógł przelać 10 000 USD na konto XXX.
Tego rodzaju ataki nazywane są Cross Site Request Forgery (XSRF). Więcej informacji na ten temat znajduje się na Wikipedii .
Głównie z tego powodu istnieje polityka tego samego pochodzenia i przeglądarki nie pozwalają na wykonywanie zapytań Xmlhttprequestów na domenach różni się od pochodzenia.
Toczy się dyskusja, aby rzeczywiście zezwolić na XHR między domenami, ale musimy zobaczyć, czy to naprawdę zostanie zaakceptowane.
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
2009-01-21 20:18:28
Jest to problem, ponieważ może być używany do złych celów, jak wspomniałeś. Może być również używany z dobrymi intencjami i z tego powodu opracowywane są protokoły między domenami.
Dwa największe problemy dotyczą tego, że jest on używany w połączeniu z cross-site scripting (XSS) i cross-site request forgery (CSRF). Oba są poważnymi zagrożeniami (dlatego trafiły do OWASP top 10 i SANS 25).
Jedynym sposobem, w jaki mogłem to zobaczyć, byłoby, gdyby ktoś miał wstawić Javascript
To jest XSS zdecydowanie zbyt wiele aplikacji jest nadal podatnych na ataki, a jeśli modele zabezpieczeń przeglądarek nie zapobiegają X-domain AJAX, otwierają swoich użytkowników na znaczny wektor ataku.
Możesz po prostu dodać img, skrypt lub element iframe do dokumentu, aby zażądać adresu URL strony trzeciej
Tak, ale te będą wysyłać HTTP_REFERRER i (w inny sposób) mogą zostać zablokowane, aby zapobiec CSRF. Połączenia AJAX mogą być fałszywe nagłówki łatwiejsze i umożliwiłyby inne sposoby obejścia tradycyjnych zabezpieczeń CSRF.
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
2009-01-21 20:28:17
Myślę, że kolejną rzeczą, która oddziela to od normalnego ataku XSRF jest to, że możesz robić rzeczy z danymi, które otrzymujesz również za pomocą javascript.
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
2009-01-21 20:34:53
Nie wiem w czym problem? Czy połączenia AJAX wysyłane do innych domen firs wysyłane do aplikacji, a następnie przekazywane gdzie indziej z filtrowanych danych, analizować zwrócone dane, jeśli naprawdę trzeba, i karmić go do użytkownika.
Obsługa wrażliwych żądań AJAX? Zdobądź przychodzące Ssaki, sprawdzając nagłówki, przechowując dane o czasie sesji lub filtrując przychodzące adresy IP do źródeł zaufania lub aplikacji.
Co ja osobiście chciałbym zobaczyć w przyszłości jest solidne zabezpieczenie wszystkich przychodzących żądań domyślnie na serwerach WWW, frameworkach i CMSs, a następnie jawnie zdefiniować zasoby, które będą przetwarzać żądania z zewnętrznych źródeł.
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
2009-01-21 20:48:59
Z <form>
możesz publikować dane, ale nie możesz ich odczytać. Z XHR
możesz zrobić jedno i drugie.
Strona taka jak {[2] } jest bezpieczna dla XSRF (zakładając, że wyświetla tylko i nie ustawia hasła) i ramek (mają politykę tego samego pochodzenia). Jednak cross-domain XHR byłby podatnością.
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
2009-01-21 21:32:39
Zamieniasz niczego nie podejrzewających gości w atakujących odmową usługi.
Wyobraź sobie również skrypt strony krzyżowej, który kradnie wszystkie twoje rzeczy facebook. Otwiera IFrame i przechodzi do Facebook.com
Jesteś już zalogowany do facebook (cookie) i idzie odczytuje swoje dane / znajomych. I robi więcej okropności.
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
2009-01-21 20:09:31