Security w Single Page Application

Security w Single Page Application
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

Witam,
próbuje zrobić security dla aplikacji typu SPA i się trochę zakręciłem. Chciałem użyć OAuth2 lub/i JWT. Jednak mam problem z przechowywaniem tokenów ponieważ z przeglądarki każdy może dostać się do tokena. Dostaje się do tokena kopiuje go i już mogę robić requesty do serwera. Czy istnieje jakiś sposób, aby zabezpieczyć się przed "kradzieżą" tokena?

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

Nie wiem co robisz do końca. (implementujesz OUATH2?)
Ale popatrz np. na zabezpieczanie COOKIE (klasyczne) - z przeglądarki każdy może odczytać COOKIe i już robić requesty do serwera...

A może korzystasz z serwisu Oauth2 - wtedy patrz "implicit flow".


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

Nie implementuje OAuth2. "Implicit flow" też Ci nic nie daje bo musisz podać ClientId.

Chodzi mi o to w jaki sposób przechowywać tokeny (ewentualnie inne dane jak np. clientId czy clientSecret) po stronie klienta, tak żeby osoby trzecie nie mogły ich odczytać i użyć.

several
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 minuty
1
Kozy napisał(a):

Jednak mam problem z przechowywaniem tokenów ponieważ z przeglądarki każdy może dostać się do tokena. Dostaje się do tokena kopiuje go i już mogę robić requesty do serwera.

Jeśli chodzi o przegląrkę to nie ma znaczenia, że ktoś ma dostęp do tokena skoro jest same origin policy. W skrócie, jeśli skrypt, który chce zrobić request na Twój serwer pochodzi z innej domeny, przeglądarka mu na to nie pozwoli.

edit
@Shalom w komentarzu słusznie zauważył że SOP można omijać, ale mógł chociaż wspomnieć, że przed CSRF można się bronić, przykłady z django np https://docs.djangoproject.com/en/dev/ref/csrf/. To pewnie też da się obejść, albo znaleźć exploit co sprowadza się do konkluzji, że jak dobry cracker się na Ciebie uprze to i tak Cie dojedzie prędzej czy później.

Generalnie nie można polegać na jednej warstwie, oauth2 ma znane problem, które są opisane chyba nawet w jakimś RFC.


edytowany 3x, ostatnio: several
Shalom
@several akurat SOP da się omijać, szczególnie w aplikacjach SPA, więc tak mocno to bym na nim nie polegał.
Shalom
Token csrf to takie-sobie zabezpieczenie bo chroni tylko przed czymś w stylu clickjackingu. Jak ktoś moze robić requesty w twoim imieniu to nic nie stoi na przeszkodzie najpierw pobrać sobie tokena a potem wykonać akcje. I nie trzeba być wielkim hackerem w czasach kiedy mamy takie rzeczy jak http://beefproject.com/ ;) A co do SOP to problem polega na tym ze SOP działa na bazie gołego URLa a nie na bazie DNSów. Jak sobie ktoś w DNS ustawi że jego domena pokazuje nagle na twój serwer to z punktu widzenia przeglądarki wszystko jest ok, bo domena ta sama (patrz: dns rebinding)
several
Jeżeli broni przed clickjackingiem to to już jest coś :) Framework to trzeba chociaż umieć obsłużyć, są gotowe narzędzia przecież do pobrania https://www.metasploit.com/ albo gotowe exploity https://www.exploit-db.com/ i to jest najbardziej przerażające, byle script kiddie może Cie dojechać. Ten DNS rebinding to ciekawa lektura nawet, dzięki :) Ale nie trzeba nawet znać konkretnych typów ataków, wystarczy googlnąć "SOP workarands" żeby znaleźć sobie liste możliwości :)
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

@Kozy ClientID nie jest tajne! Czyli implicit flow -> po to powstał, żeby w przeglądarce dało się użyć (pytanie czy twój provider to wspiera).
A korzystający z przeglądarki zawsze da radę je sobie token wyciągnąć. Tylko, że dlaczego to niby ma być problem?
Zalogowałem się do Twittera z twojej aplikacji.. i co? Teraz sobie swojego tokena podejrze... to nie jest dramat.

http://oauthlib.readthedocs.io/en/latest/oauth2/grants/implicit.html


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

@jarekr000000 ale jak odejdziesz od przeglądarki i ktoś albo coś innego dostanie się np. do localStorage/sessionStorage (może to nie najlepsze miejsce zapisywania tokena, podałem tak przykładowo) gdzie jest zapisany token to może Ci namieszać w Twoich zasobach.

Providerem jestem ja, tzn. moja aplikacja i tutaj sobie mogę manipulować. Moją pierwszą myślą było użycie grant_type=password ze względu na frontend - nie ma zbędnych przekierowań. Tylko mam problem z trzymaniem tych wszystkich danych (clientId, clientSecret, token, refresh_token) w przeglądarce. Myślałem, żeby zrobić sobie jakieś cienkie proxy, gdzie można byłoby trzymać te dane (lub część danych - tylko clientId i clientSecret), nie wiem czy to jest dobry pomysł.

Jeszcze ogarniam JWT i może to będzie lepsza droga? Tylko tam znowu pojawia się ten sam problem.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
Kozy napisał(a):

@jarekr000000 ale jak odejdziesz od przeglądarki i ktoś albo coś innego dostanie się np. do localStorage/sessionStorage (może to nie najlepsze miejsce zapisywania tokena, podałem tak przykładowo) gdzie jest zapisany token to może Ci namieszać w Twoich zasobach.

@Kozy - jak odejdziesz od przeglądarki to ktoś może Ci zainstalować piękne rezszerzenie, keylogera itp. Trudno Ci się będzie przed wszystkim obronić.

Sam token najlepiej nie przechowuj w localStorage tylko jak var wewnątrz modułu JS - trudno jest się do tego dostać. Do tego jeśli ustawianie tokena zrobisz automatycznie hookiem (podmiana) XMLHttpRequest.prototype.open
to nie tak łatwo będzie się do niego dostać (musisz sprawdzać tylko Czy ktoś jeszcze nie przejął 'open'... (Poprawka: hmm nie wiem czy to może być skuteczne - jak ktoś najpierw podmieni 'open' - to chyba nie dasz rady sprawdzić, że to obcy kod)).
Wtedy na pewno wydostanie tokena będzie trudne nawet jak ktoś Ci zrobi XSS.

Ale jak ktoś ma fizyczny dostęp do przeglądarki to sorry... Nie wiem co wtedy można zrobić i czy jest praktyczny sens?


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

Dobra, faktycznie chyba za dużo chcę zrobić.

several
  • Rejestracja:ponad 15 lat
  • Ostatnio:3 minuty
0

@Kozy jak ktoś ma fizyczny dostęp do maszyny to maszyna jest skompromitowana. Pozostaje mieć nadzieję, że kiedyś może przeglądarki będą używać np. SGXa do przechowywania wrażliwych zasobów, ale trochę potrwa zanim to nastąpi, jeśli w ogóle.


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)