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
Jeśli oba końce są zaufane, nie ma niebezpieczeństwa w jsonp (to w zasadzie tylko
<script>
tag).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.
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. –