Ochrona przed atakiem CSRF, jak przechowywać token u klienta? tag meta vs cookies?

0

Mam pytanie odnośnie wysyłania i przechowywania lokalnie tokenów CSRF. Do tej pory tokeny przesyłałem w nagłówku i lokalnie przechowywałem w tagach meta na stronce. Usłyszałem jednak od kolegi z pracy, że w metatagach nie powinno się trzymać ponieważ tak naprawdę niezależnie czy jest https czy nie, to atakujący może z poziomu js'a uzyskać dostęp do pliku html klienta i pobrać token z tagów, podobnie będzie z trzymaniem tokenów w ukrytym formularzu na stronie. Trochę się zdziwiłem, bo o ochronie przed csrf uczyłem się również z dokumentacji Spring Security i zalecają trzymanie ich w tagach na stronie.... Jak i również czytałem gdzieś, że atakujący nie może mieć dostępu do strony, która wyświetla się klientowi. Chyba, że to jest własnie cel ataku XSS ? (nie uczyłem się jeszcze o tym za bardzo).
Poradzono mi aby trzymać lokalnie token w cookiesie. Jak zacząłem googlować na ten temat to faktycznie znalazłem takie porady, ale wychodzi na to że informacje są sprzeczne. O ile rozumiem sens trzymania tokena w cookies lokalnie, to nie wiem jak do końca to ma być zrobione. Według mnie nie powinno się wysyłać z serwera cookiesa z tokenem bo to by nie miało sensu jakiegokolwiek ochrony przed atakiem CSRF, przecież niezależnie czy mamy https czy nie to requesty przejdą razem z cookiesami. (takie porady również widziałem).
Czy dobrze myślę, że w takim razie powinienem przesyłać token w nagłówku, a do cookiesa zapisywać go tylko lokalnie? To ochroni apke przed csrf, a jeśli do tego dojdzie https to dobranie się do tokena w headerze poprzez man-in-the-middle nie będzie możliwy.

4

Zacznijmy od tego: czy ty rozumiesz PO CO stosuje się tokeny CSRF? Bo po twoich pytaniach odnoszę wrażenie że zwyczajnie nie. Realistycznie każda z tych opcji jest ok, bo przecież token nie ma i wcale nie musi być tajny!

CSRF = cross site request forgery. Idea tego ataku jest taka, że np. ja ci daje link facebook.com/deleteAccount, ty go klikasz i myk, usuwa ci konto. Albo lepiej, mam skrypt który ajaxem wysyła request na taki adres i usuwa ci konto! Tylko że ta druga opcja nie jest możliwa ze względu na single origin policy ;) (edit: oczywiście jest możliwa!) Wracamy do pomysłu z linkiem, no ale mała szansa że taki link klikniesz, a nawet jeśli to facebook wykryje że nie wysłałeś poprawnego tokena CSRF i odrzuci request. Analogicznie jeśli zrobie sobie formularz na stronie i w tym formularzu dam form action na to usuwanie konta na facebooku, ale znów muszę mieć poprawny token! Żeby dostać token musiałbym zrobić GET na tą stronę i pobrać sobie token, a znów to nie jest takie proste bo mamy single origin policy. Nie możemy ot tak sobie zrobić requestu ajaxem w tle, bo nie będziemy mogli odczytać zawartości strony. Więc skąd wziąć ten token?
Stąd popularne teraz clickjacking -> w niewidzialnym iframe renderuje się jakaś strona i z niej bierzemy token a potem user w coś u nas klika i przekonujemy przeglądarkę że user chciał wysłać formularz.

Tak czy siak widzisz chyba ze generalnie nie ma znaczenia czy token idzie w headerze, cookie czy jest w treści strony tak na dobrą sprawę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1