2010-08-31 12 views
8

W naszej aplikacji internetowej mamy do czynienia z sytuacją, w której musimy wykonać połączenia między domenami AJAX z jednej domeny, którą w pełni kontrolujemy, do innej domeny, którą w pełni kontrolujemy. Przeglądałem najlepsze rozwiązanie, a dwie, które przychodzą na myśl, to lokalny serwer proxy plików (plik lokalny używający php :: fopen) lub jquery/JSONP.Jakie są zagrożenia związane z komunikacją JSONP między domenami?

Gdy patrzę w górę, widzę, jak ludzie regularnie mówią o tym, jak niebezpieczne jest używanie JSONP, ponieważ ktoś może wstrzyknąć do niego złośliwe dane. Dylemat polega na tym, że większość argumentów przemawiających przeciwko niemu wydaje się zawierać dużo wody, więc przychodzę tutaj, aby poprosić Stack o wyjaśnienia.

Jakie są specyficzne wektory ataku, który zostałby otwarty przez JSONP między domenami?

Z mojego zrozumienia jedyny wektor dla jsonp jest dokładnie ten sam wektor, który jest otwarty przez włączenie <script> tag w miejscu, którego src jest dowolny miejscu, które nie jest kontrolowane przez ciebie: To mogły włączyć złośliwy i zacznij uprawiać sesje użytkownika/pliki cookie/dane. Jeśli to prawda, to wydaje się, że to nie protokół (JSONP) jest problemem, ale raczej źródło, z którego dane są zbierane.

Bo to, czy był to serwerowy serwer proxy, znacznik <script>, czy ajax/JSONP, oznacza ryzyko, że umieszczam zawartość innej osoby na mojej stronie i mogą rozpocząć sesje użytkownika, jeśli czują się zobligowani (w sposób, w jaki robi to Google Analytics za pomocą znacznika skryptu).

Wiele wektorów, z których słyszę zawias online po niewłaściwym sprawdzeniu formularzy i danych przesłanych przez użytkownika. Na przykład JSONP służy do pobrania pliku, który umieszcza dane w formularzu, a następnie formularz jest przesyłany do wstawienia bazy danych. Jeśli dane z tego formularza są zaufane, ponieważ pochodzą z zaufanego źródła (danych JSONP) i są wprowadzane bez sprawdzania poprawności, to znowu nie jest to błąd JSONP, lecz niewłaściwie zweryfikowane dane wejściowe użytkownika. Użytkownik może wprowadzić te same modyfikacje do tego formularza za pomocą Firebug, ale na końcu sprawdziłem, czy nikt nie nazywa Firebug wektorem bezpieczeństwa.

Ostatnim elementem jest przekonanie, że dzięki serwerowi proxy istnieje większa możliwość filtrowania wyników przed przekazaniem ich klientowi. Jednak niezależnie od tego, czy to PHP, czy JavaScript, mogę filtrować wyniki, aby usunąć takie rzeczy jak onclick lub iframe. Oczywiście strona po stronie klienta mogłaby zmienić moją funkcję javascript, aby usunąć filtrowanie, ale filtrowanie wpłynęłoby tylko na ich konkretne wrażenia klienta i nie zostałoby zmienione dla innych użytkowników, zapobiegając w ten sposób trwałemu atakowi XSS dla wielu klientów.

Oczywiście istnieją pewne korzyści dla serwera proxy po stronie serwera, ponieważ może to ułatwić rejestrowanie potencjalnych ataków XSS, ale pod względem zapobiegania atakowi zarówno PHP, jak i Javascript wydają się mieć odpowiednie narzędzia. W pewnym sensie wydaje się, że JSONP jest w rzeczywistości bezpieczniejszy niż zwykły tag <script>, ponieważ przynajmniej z JSONP wynik przechodzi przez funkcję, która oznacza, że ​​jest nieco filtrowana, a nie tylko powszechna, jak ma to miejsce w przypadku <script>.

Czy istnieje pewne ryzyko, którego mi brakuje lub czy nie widzę? Jeśli poprawnie zrozumiem problem, nie ma ryzyka związanego z bezpieczeństwem korzystania z JSONP w celu uwzględnienia zawartości pliku, któremu ufamy ze źródła, któremu ufamy. Czy to jest dokładna ocena?

ROZWIĄZANIE

  1. Jeśli oba końce są zaufane, nie ma niebezpieczeństwa w jsonp (to w zasadzie tylko <script> tag).

  2. Oba skrypty/JSONP mają te same luki w zabezpieczeniach, ponieważ są automatycznie wykonywane, a nie po prostu transmitują jako dane. Korzystanie z serwera proxy po stronie serwera oznacza, że ​​zwrot między domenami jest przekazywany jako dane i może być filtrowany w poszukiwaniu szkodliwej zawartości. Jeśli międzydomenowa jest w pełni zaufana, to JSONP/SCRIPT jest bezpieczny, jeśli istnieje podejrzenie ryzyka, a następnie przeprowadź go przez serwer proxy filtru.

+0

Niekoniecznie trzeba budować serwer proxy za pomocą 'fopen'. Równie dobrze możesz użyć 'mod_proxy 'Apache'a do obsługi żądań z innej domeny. –

Odpowiedz

1

Kiedy kontrolować oba końce wniosku, większość tradycyjnych bezpieczeństwa obaw o jsonp nie są problemem.

Dodatkowym problemem, który napotkasz, jest to, że niektórzy użytkownicy blokują skrypty innych firm jako środek bezpieczeństwa. To również zablokuje twoje żądania JSONP. Podejście serwera proxy po stronie serwera nie ma tego problemu.

6

Istnieje DUŻA różnica między server-side-proxy i <script>/JSONP. W pierwszym przypadku należy pobrać dane, w tym ostatnim pobraniu i automatycznie wykonaćkod

Podczas tworzenia po stronie serwera proxy, kod JavaScript może używać XmlHttpRequest ściągnąć dane. Te dane nie będą wykonywane automatycznie; musisz jawnie zrobić coś głupiego, na przykład eval(), aby go uruchomić. Nawet jeśli format danych to JSON, a drugi serwer został przejęty, a twój serwer proxy po stronie serwera nie złapie kompromisu, nadal masz linię obrony dostępną dla twojego kodu klienta. Można na przykład przeanalizować JSON przy użyciu safeJSON parser i odrzucić złośliwy skrypt.

Ale kiedy używasz znacznika JSONP lub <script>, bezpośrednio dodajesz kod innej osoby: kod. Ponieważ jego kod (a nie dane) przeglądarka automatycznie wykonuje go, nie dając szansy na sprawdzenie lub modyfikację.

Podsumowując, po stronie serwera proxy daje dwie dodatkowe linie obrony -

  1. Możliwość wglądu dane na serwerze dla złośliwej zawartości
  2. Możliwość wglądu dane w javascript przed wykonanie, jeśli w ogóle, musisz go wykonać.
+0

Wspomniałeś o dwóch korzyściach dla ss-proxy, ale czy nie mogę zrobić ich obu, filtrując powrót JSONP? W jaki sposób jestem * nie może * filtrować wyniki JSONP, które mogę z ss-proxy ... jeśli na przykład używam jQuery i zdefiniować callback $ .get ("blah.php? Callback =?", Funkcja (dane) {filtr (dane)}); jak to się różni od SS-proxy? – Nucleon

+1

JSONP ma zwrócić coś podobnego do tego 'callback ({" some ":" data "});', gdzie callback to nazwa funkcji, którą określasz. Ale nazwa wywołania zwrotnego jest po prostu konwencją. Jeśli serwer tego chce, może po prostu zwrócić 'sendCookieToAttacker (document.cookie) ;, a funkcja, którą przekażesz do JQuery, nigdy nie zostanie wykonana. Domyślnie ufasz serwerowi, aby wywoływał funkcję zwrotną, ale nie ma absolutnie żadnej gwarancji, że zostanie wywołana. –

+0

W tym przykładzie SRI, sendCookieToAttacker() musiałby zdefiniować już inaczej, gdyby nic nie osiągnął, prawda? Ponadto musiałby być zdefiniowany w sposób ciągły, w przeciwnym razie wpłynąłby jedynie na poprawność klienta hakerów? – Nucleon

Powiązane problemy