Web API a weryfikacja klientów mobilnych

Web API a weryfikacja klientów mobilnych
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

Mam system składający się z mikroserwisów które są niedostępne z zewnątrz. Dostęp do systemu odbywa się za pomocą "backend for frontend", czyli Web API mający dostęp do wewnętrznych mikroserwisów, hostujący aplikację webową (SPA napisane w React) oraz dostarczający odpowiednich endpointów w celu weryfikacji i pchania requestów do wewnętrznych systemów. Ten serwis ma zabezpieczenia takie jak polityka CORS, anti-forgery tokens itp. Prawdopodobnie do tego systemu dojdą klienci w postaci aplikacji mobilnych (natywne). Będzie więc trzeba jakoś zapewnić dostęp do wewnętrznego systemu (mikroserwisów), ale ze względów bezpieczeństwa jak i separacji odpowiedzialności bezpośredni dostęp nie jest opcją. Siłą rzeczy rozwiązaniem będzie jakieś API gateway/kolejny serwis "backend for frontend".

Moje pytanie jest takie- czy są jakieś sprawdzone albo rekomendowane sposoby na zabezpieczenie API tak aby można było dopuścić komunikację tylko ze strony tych aplikacji mobilnych? Dodam że aplikacje nie będą wymagać zalogowania, więc uwierzytelnianie użytkownika nie wchodzi w grę. Czy w ogóle Waszym zdaniem próba zabezpieczenia tego i ograniczania dostępu tylko klientom mobilnym ma tutaj sens? Jedno co mi przychodzi do głowy to jakiś API key załączony z aplikacją na telefonie. Tylko że na nic się to zda jeśli ktoś naprawdę będzie chciał wysyłać requesty bezpośrednio, bo zrobi reverse engineering i sprawdzi co jest wysyłane w requestach.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
FS
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:46
0

napisz albo znajdz detekcje, czy meta ma w sobie mobile

Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

@FullSnack: problem w tym że to jest połowiczne rozwiązanie. Nie chodzi o to żeby ograniczyć przyjmowanie requestow do urządzeń mobilnych (jakichkolwiek), tylko do konkretnych aplikacji mobilnych.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
czubeka2
  • Rejestracja:około 12 lat
  • Ostatnio:9 miesięcy
  • Postów:53
0

To może klucze API? Każda aplikacja miałaby zaszyty klucz który byłby przesyłany w nagłówkach żądania i walidowany po stronie proxy/backendu

DP
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:159
0
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 11 godzin
  • Postów:5108
5

Jeżeli ma to być rozwiązanie z perspektywy security, to wydaje mi się że z uwagi na to jak działa HTTP, to nie da się tego w 100% zrobić aby wymusić mobile device only / dana appka.

Waszym zdaniem próba zabezpieczenia tego i ograniczania dostępu tylko klientom mobilnym ma tutaj sens?

pytanie tylko czy to problem, że ktoś skorzysta z serwisu przeznaczonego dla mobilek z innego urządzenia / curlem / postmanem itd?

edytowany 5x, ostatnio: WeiXiao
hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:13 dni
0

Jedyną opcją jaką widzę to mTLS z kluczem klienta trzymanym w jakiejś enklawie, z której nie da się wyciągnąć klucza prywatnego. Pozostaje jedynie kwestia tego jak uwierzytelnić klucz publiczny.


piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 12 godzin
  • Postów:3277
2

Jeżeli celem jest "nie może dać się połączyć z backendem z poziomu innych aplikacji" to w skrócie - nie da się.
Jak wystawiasz API po HTTP, to nie da się zablokować żądań wykonanych np. Postmanem. Żeby identyfikować klienta, potrzebujesz przechowywać jakiś sekret po jego stronie, czyli poza twoją kontrolą. Teoretycznie urządzenia mobilne mają wbudowane key vaulty, do których nic poza koszerną aplikacją nie ma dostępu, tylko jakoś trzeba ten sekret tam załadować. Czyli masz ten sam problem co wcześniej, tylko w trochę innym miejscu.

Ostatecznie wszystko sprowadza się do standardowego podejścia w budowaniu API - uwierzytelnianie użytkownika / usługi, które się łączą z twoim API. Polecam skorzystanie do tego celu z jakiegoś zewnętrznego serwisu typu FireBase, czy inne Auth0. W przypadku tego pierwszego masz o ile pamiętam jakieś delikatne zabezpieczenia na właściwy podpis łączącej się aplikacji, przynajmniej w przypadku Androida. Generalnie użycie tych usług ma sens również w przypadku aplikacji webowych, szczególnie biorąc pod uwagę jak kiepsko potrafią być zaimplementowane uwierzytelnianie i autoryzacja (na przykładzie wyciekających co chwila zbiorów danych z tego, czy innego sklepu).

FS
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:46
0

@Aventus: wtedy ta sama detekcja ale konkretnej aplikacji ( mozna zrobic i czy jest mobile i czy jest od danej aplikacji mobile)
w zasadzie wiedzac, czy dany request jest mobile , mozna zalozyc , ze dana apka requestujaca ,tez jest mobile

edytowany 1x, ostatnio: FullSnack
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
2

ale jak ktoś spreparuje request to jak chcesz to wykryć? Chodzi o to, że jeśli API będzie filtrowało po czymś co jest jawne (np. nie będzie w requeście przychodził jakiś zaszyfrowany / podpisany secret czegoś co API wysłało wcześniej tylko jakiś stały text, np. i'm from ebedded) to odpowiednio uparty człowiek taki request spreparuje. A jeśli coś będziesz szyfrował/podpisywał/whatever to gdzieś te klucze musisz mieć i do nich też się będzie odpowiednio uparty człowiek mógł dostać. Generalnie z każdej strony dupa.
Jeszcze nikt nie wymyślił zabezpieczenia nie do złamania - jest tylko kalkulacja kosztów do zysków.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber
FS
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:46
1

Nie wiem czy chodzi o zabezpieczenia ale zostało to tu chyba idealnie podane na tacy : Web API a weryfikacja klientów mobilnych

Ja pisze o wykrywaniu czy jest mobile czy nie , bo chyba takie bylo pytanie .. Jesli chodzi o zabezpieczenie to dlaczego nie dac w headers jakiegos tokena , uwierzytelniająco-informacyjnego

GZ
  • Rejestracja:około 4 lata
  • Ostatnio:około rok
  • Postów:35
0

Czy nie robi się tego przez wystawianie certyfikatów na komputer klienta ?
Tak samo można zainstalować certyfikat na Androidzie - przy założeniu że aplikacja jest dla konkretnej, wąskiej grupy odbiorców.

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 12 godzin
  • Postów:3277
1

@FullSnack: Bo przechwycenie tokena w nagłówku http jest trywialne, jak go masz, to możesz użyć gdzie chcesz podobnie z pomysłem @gosc_z_pytaniem - ten certyfikat jest na urządzeniu do którego użytkownik ma pełne prawa.

FS
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:46
0

Ok, masz intranet mikroserwisow i chcesz dodac nowych klientow mobilinych, ktorzy beda bez uwierzytelniania.

Siłą rzeczy rozwiązaniem będzie jakieś API gateway

ciężko inaczej - jakieś proxy , ktore odwołuje się do jakiegoś endpoint, który gada z mikroserwisami

API key załączony z aplikacją na telefonie

jesli bez uwierzytelniania to srednio ma to sens (chyba , że taki bogus, zmylenie tropu ) jednak to :

wysyłać requesty bezpośrednio, bo zrobi reverse engineering i sprawdzi co jest wysyłane w requestach

możesz użyć np. Websockets (tak, że tylko serwer może wysyłać do klienta) i robić pseudo-uwierzytelnianie (a raczej generowanie hasha (czy czegos)) do tego proxy - w oparciu o to co możesz wydobyć, na temat sprzętu/telefonu/tableta którego używa i generować unikalną sygnature dla kazdego podłączonego klient- w ten sposob możesz też wyciąć szybko ddos, oraz próby ataku np. z cli

edytowany 4x, ostatnio: FullSnack
Aventus
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

Wybaczcie, nie kliknąłem obserwacji wątku i nie wiedziałem że jest tyle odpowiedzi...

@WeiXiao

pytanie tylko czy to problem, że ktoś skorzysta z serwisu przeznaczonego dla mobilek z innego urządzenia / curlem / postmanem itd?

Na pierwszy rzut oka nie ale bardzo ważne są miarodajne statystki dla działu marketingu. Gdyby z jakiegoś powodu ktoś zaczął się bawić requestami wychodzącymi spoza naszych aplikacji mobilnych, i uderzał do API przeznaczonego właśnie dla tych aplikacji mobilnych to statystyki zostałyby zakłamane.

@hauleth możesz to rozwinąć lub podesłać link(i)?

@piotrpo uwierzytelnianie użytkownika odpada, bo aplikacja ma głownie cel marketingowy i ma zapewnić jak najmniejsze przeszkody dla użytkownika. Anonimowe używanie tychże aplikacji to jedno z fundamentalnych wymagań biznesowych i nie podlega dyskusji- czy mi się to podoba czy nie.

@FullSnack możesz to rozwinąć? Czym w takim przypadku jest ta "meta" i dla czego ktoś nie mógłby tego nadpisać np. w Postmanie?
Oraz co do tego:

Ja pisze o wykrywaniu czy jest mobile czy nie , bo chyba takie bylo pytanie

Nie, chodzi o konkretne aplikacje mobilne (te stworzone przeze mnie).

@abrakadaber

ale jak ktoś spreparuje request to jak chcesz to wykryć?(...) Generalnie z każdej strony dupa.

No właśnie o to się rozchodzi :)

@gosc_z_pytaniem

Tak samo można zainstalować certyfikat na Androidzie - przy założeniu że aplikacja jest dla konkretnej, wąskiej grupy odbiorców.

Docelową grupową odbiorców są anonimowe osoby mogące zainstalować aplikację z Google Play/Apple App Store.


Ogólnie chodzi o to że jest system ubezpieczeniowy dostarczający informacje o polisach- celem jest ograniczenie tego aby każdy mógł sobie dowolnie z tego systemu korzystać podszywając się pod klienta mobilnego (tego którego my stworzyliśmy). O ile to w ogóle możliwe- stąd też ten wątek. Do tego dochodzi kwestia statystyk którą opisałem w odpowiedzi do WeiXiao.


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
cerrato
nie kliknąłem obserwacji wątku - Coś ściemniasz, autor wątku (a także każda osoba się w nim udzielająca) z automatu ma dodawany wątek do obserwowanych :p
Aventus
@cerrato: No chyba nie... Ja nigdy tak nie miałem, aż sprawdzę zaraz...
cerrato
Ja tak mam zawsze. Chyba, że może jest to coś co ustawienia w konfiguracji. Ale tam się chyba ustawia powiadomienia, a raczej fakt obserwowania wątku dla OPa jest czymś logicznym i oczywistym ;)
Aventus
@cerrato: Chyba, że może jest to coś co ustawienia w konfiguracji. bingo :)
cerrato
Kolejna wielka zagadka ludzkości została rozwiązana ;)
AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Postów:3561
1

A ja powiem - nigdy nie byłem religijny zwolennikiem REST zawsze i za każdą cenę - że apkę mobilną można połączyć na wielu różnych protokołach, a nie tylko HTTP+REST
(zwłaszcza że połowa wdrożeń REST , to jest REST zgwałcony)

Np bardzo dobrze - co sprawdziłem własnymi paluchami - apke mobilną z centralnym serwerem się łączy Apache Thrift.
Wydajnie, z małym obciążeniem RAM, sieci i procesorów, i cokolwiek bardziej dyskretne.

Dobre RPC nie jest złe, pozwala np nie kłamać, że mamy bezstanowy REST. A dziś to wiedza zaginiona, z "dinozaurami", a młodym się RPC przekazuje w strasznych bajkach, jak o czarnym wilku.itd..

Chory w stosunku do wymagań początkowy wybór (tu: wysoce otwarty meta-protokoł REST, gdy chcemy zamknięty) - to potem wychodzi szydło z worka.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
Zobacz pozostałe 8 komentarzy
GZ
Dyskusja w wątku wyjaśniała, że można spreparować requesty w Postmanie czy innym narzędziu i tak samo można zrobić z Apache Thrift czy gRPC, więc wymiana protokołu w tym kontekście nie ma znaczenia, tak więc być może nie wychodzi "szydło z worka" bo wybrany początkowo wybór wysoce otwartego meta protokołu może nie być taki całkiem chory.
AK
Mówimy o różnicy pracochłonności o rząd wielkości albo raczej trzy rzędy w "spreparowaniu danych w Postmanie". Kolega zagadnienie przedstawił jako marketingowe a nie "transakcyjne", wiec nie wypowiadam się na poziomie "securitowym"
GZ
Czyli jak by było w tej apce np. gRPC to by pomogło to rozwiązać ten problem w tym zagadnieniu marketingowym ?
AK
W mojej opinii podniosło by poziom reverse engeneeringu do nieopłacalnego. Ciekawie jakie zdanie ma @Aventus
GZ
Ok. Dzięki za wyjaśnienie.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 11 godzin
  • Postów:5108
1

@Aventus:

Na pierwszy rzut oka nie ale bardzo ważne są miarodajne statystki dla działu marketingu.

A może to nie problem komputerowy, a data scajensowy?

Czy statystyka oferuje jakieś narzędzia aby odstrzelić takich gagatków?

dodać do tego jakiś monitoring/alert wykrywający podejrzane zachowanie np. 100 requestów w 30sec, jakaś powtarzalność - strzelam sobie

aby ich pomijać

edytowany 3x, ostatnio: WeiXiao
FS
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:46
1

Jeśli to tylko dla Twoich aplikacji, to dlaczego nie jakies uwierzytelnianie w oparciu o email albo sygnature sprzetowa...

Meta, jesli to sa requesty https, to masz tez tzw. headers (nagłówki) , tam możesz dodac co chcesz, np. kazdorazowo jakis wygenerowany token z twojej apki, który jest unikalny dla każdego klienta

Screenshot from 2021-08-29 15-03-19.png

Masz tu rozne naglowki, mozna dodac swoj p. X-SUPER-SECRET-TOKEN : jakis.token.dla.proxy(gateway)

edytowany 3x, ostatnio: FullSnack
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)