Buduję usługę sieciową, która używa wyłącznie formatu JSON do obsługi żądań i odpowiedzi (tj. Żadnych ładunków zakodowanych w formularzu).
Czy usługa internetowa jest podatna na atak CSRF, jeśli spełnione są następujące warunki?
Każde
POST
żądanie bez obiektu JSON najwyższego poziomu, np.,{"foo":"bar"}
Zostanie odrzucone z wartością 400. Na przykładPOST
żądanie z zawartością42
zostanie w ten sposób odrzucone.Każde
POST
żądanie o typie treści innym niżapplication/json
zostanie odrzucone z wartością 400. Na przykładPOST
żądanie o typie treściapplication/x-www-form-urlencoded
zostanie odrzucone.Wszystkie żądania GET będą bezpieczne i nie będą modyfikować żadnych danych po stronie serwera.
Klienci są uwierzytelniani za pomocą sesyjnego pliku cookie, który serwis internetowy przekazuje im po podaniu poprawnej pary nazwa użytkownika / hasło za pośrednictwem POST z danymi JSON, np
{"username":"[email protected]", "password":"my password"}
.
Pytanie pomocnicze: czy PUT
i DELETE
żądania są kiedykolwiek podatne na CSRF? Pytam, ponieważ wydaje się, że większość (wszystkich?) Przeglądarek nie zezwala na te metody w formularzach HTML.
EDYCJA: Dodano punkt nr 4.
EDYCJA: Jak dotąd wiele dobrych komentarzy i odpowiedzi, ale nikt nie zaproponował konkretnego ataku CSRF, na który ta usługa sieciowa jest podatna.
Odpowiedzi:
Kucie arbitralnych żądań CSRF z typów arbitralne mediów jest skuteczne tylko możliwe XHR, ponieważ metoda formularza jest ograniczona do GET i POST oraz POST wiadomość ciało formy jest również ograniczona do trzech formatach
application/x-www-form-urlencoded
,multipart/form-data
oraztext/plain
. Jednak dzięki kodowaniu danych formularzatext/plain
nadal można fałszować żądania zawierające prawidłowe dane JSON .Więc jedyne zagrożenie pochodzi z ataków CSRF opartych na XHR. A te odniosą sukces tylko wtedy, gdy pochodzą z tego samego źródła, a więc w zasadzie jakoś z Twojej własnej witryny (np. XSS). Uważaj, aby nie pomylić wyłączenia CORS (tj. Nie ustawiania Access-Control-Allow-Origin: *) jako ochrony. CORS po prostu uniemożliwia klientom odczytanie odpowiedzi. Całe żądanie jest nadal wysyłane i przetwarzane przez serwer.
źródło
application/json
który jest używany do powstrzymywania ataków CSRF w tej odpowiedzi. Proponowany standard pozwoli ci ustawić enctype naapplication/json
, co spowoduje pokonanie kontroli typu zawartości przedstawionej w odpowiedzi i otworzy aplikację na CSRF.application/json
posty formularza muszą być zgodne z tą samą polityką pochodzenia, co oznacza, że atak nie jest silniejszy niż XHR.Tak to mozliwe. Możesz skonfigurować serwer atakującego, który odeśle przekierowanie 307 do serwera docelowego na zaatakowaną maszynę. Aby wysłać POST, musisz użyć Flasha zamiast formularza.
Źródła: https://bugzilla.mozilla.org/show_bug.cgi?id=1436241
Działa również w przeglądarce Chrome.
źródło
Możliwe jest wykonanie CSRF na usługach Restful opartych na JSON przy użyciu Ajax. Przetestowałem to na aplikacji (używając zarówno przeglądarki Chrome, jak i Firefox). Musisz zmienić contentType na text / plain i dataType na JSON, aby uniknąć żądania wstępnego. Następnie możesz wysłać żądanie, ale aby wysłać sessiondata, musisz ustawić flagę withCredentials w swoim żądaniu ajax. Omawiam to bardziej szczegółowo tutaj (w tym odniesienia):
http://wsecblog.blogspot.be/2016/03/csrf-with-json-post-via-ajax.html
źródło
Mam pewne wątpliwości co do punktu 3. Chociaż można go uznać za bezpieczny, ponieważ nie zmienia danych po stronie serwera, dane można nadal odczytać i istnieje ryzyko ich kradzieży.
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
źródło
Tak. To nadal HTTP.
tak
Czy uważasz, że przeglądarka to jedyny sposób na wysłanie żądania HTTP?
źródło