Rest API w PHP dla aplikacji Android

0

Robię aplikację na telefon która będzie korzystała z "REST API" napisanego w PHP czyli po prostu obsługa POST request. Aplikacja będzie używała Retrofit + OkHttp z wygenerowanym certyfikatem SSL. Chcę użyć php ponieważ nie będę musiał bawić się serwery dedykowane aby takie api napisać np w javie tylko wystarczy mi prosty serwer dla stron www. Tylko jest jeden minus skrypt w PHP obsłuży także zwykłego forma z html a tego nie chcę... Chciałbym zablokować RESTA w PHP aby osbługiwał tylko szyfrowane zapytania z aplikacji. Pomysł mam taki aby aplikacja doklejała do zapytania dodatkową informację typu ID aplikacji, teoretycznie całe wtedy zapytanie leci szyfrowane więc nawet jeśli ktoś będzie chciał przechwycić jaki jest to ID aplikacji to tego nie zrobi i zapytanie ze zwykłego forma html do tego skryptu PHP nie przejdzie bo nie będzie prawidłowego ID aplikacji.

Co o tym myślicie jest to bezpieczne rozwiązanie? (wystarczające?) Chcę za wszelką cenę uniknąć nie powołanych wywołań tego kodu bo może mnie to narazić na koszta.

1

A skąd to ID aplikacji miałoby pochodzić? Bo jeżeli z aplikacji, to każdy może się do takiego czegoś dostać w 2 minuty. Jeżeli chcesz ograniczyć dostęp do zasobów, to nie obędzie się bez autentykacji.

0

jesli chodzi o autentykacje to używam dostępnego narzędzia z google czyli Firebase authentication, Możesz podrzucić jak to ogarnąć aby zabezpieczyć przed wywołaniami poza aplikacją? Jestem w tym temacie całkowicie zielony jeśli chodzi o PHP i zabezpieczenia. Może przesyłanie user id w headerze ? Czemu sądzisz że w 2 minuty się ktoś dobierze przeciez będzie to leciało po https

1

Bo da się dobrać do tego co lata w aplikacji. Jeśli aplikację ma użytkownik to już nie masz nad nią kontroli

Przykład
https://niebezpiecznik.pl/post/jak-sie-hackuje-te-najnowsze-maszyny-sprzedajace/

Twoja aplikacja to klient, który tylko przedstawia się serwerowi. Jeśli wiem jak się przedstawia klient to mogę udawać klienta skryptem

0

Ogólnie to nie jesteś w stanie zabezpieczyć się przed tym, żeby dostęp do Twojego backendu był tylko i wyłącznie z Twojego klienta, jeżeli masz publiczne API. Każdy może napisać sobie jakąś aplikację kliencką, która będzie się komunikowała z serwerem. I nie jest to nawet zależne od autentykacji, bo można też ją dodać do innych klientów. Możesz się przed tym bronić za pomocą np. rejestrowania urządzeń, ale po pierwsze jest to niewygodne dla użytkownika, a po drugie to też można zduplikować.

Jak połączyć Firebase z serwerem PHP nie wiem, bo nigdy tego nie robiłem.

Z kolei ID aplikacji mogę uzyskać na różne sposoby. Mogę na przykład ściągnąć aplikację z telefonu, zdekompilować ją i zobaczyć kod źródłowy. Mogę też napisać własną aplikację, która będzie analizowała inne, zainstalowane na telefonie i by pozwalała na przeglądanie ich kodu. Pewnie i inne sposoby by się znalazły.

0

Przecież może ograniczyć do konkretnego IP (domowego czy VPN) i każdy request będzie z góry odrzucany.

1

Wątek 2minut: aplikacje androida można w bardzo prosty sposób zdekompilowac np tutaj: http://www.javadecompilers.com/apk Kod po zdekompilowaniu jest bardzo czytelny dla osoby mającej doświadczenie na androidzie. Stosując proste metody np szukac danych po słowach kluczowych np retrofit http volley internet @get @post itp mozna szybko znaleźć kod odpowiedzialny za połączenie, potem to już z górki. Jeśli zapiszesz np token w pliku xml to będzie on dostępny po zdekompilowaniu. Już nawet nie chce wchodzić w sniffowanie sieci albo dostęp do danych gdy telefon jest zrootowany. Złota zasada: telefon nie jest bezpieczny tzn nalezy przyjąć że kod który napiszesz/algorytm jaki wykorzystasz będzie odczytany.

0
itsme napisał(a):

Przecież może ograniczyć do konkretnego IP (domowego czy VPN) i każdy request będzie z góry odrzucany.

Może źle zrozumiałem autora, ale chyba nie chodzi o aplikację dla samego siebie.

0

Aplikacja bedize dostepna dla wszsytkich. Chodzi mi o to aby wykonanie pewnych metod w php nie byl dostepny dla wszystkich (nieporzadane wykonania). Jeśli wszystko lata po https z certyfikatem SSL) to jesli bede w apce wyciagla user id z firebase i przesylal go w headerze do php (SSL) to bedzie mozliwy i tak do wyciagniecia przez osoby postronne? hmm kurde nie wiem jak sie zabezpeczyc aby nie szlo symulować nieporządanych wywołań

0

No to zrób sobie middleware, który będzie sprawdzał czy user jest zarejestrowany w firebase. Jak nie do dziękuję, do domu.

0
Czarny szczeniak napisał(a):

Aplikacja bedize dostepna dla wszsytkich. Chodzi mi o to aby wykonanie pewnych metod w php nie byl dostepny dla wszystkich (nieporzadane wykonania). Jeśli wszystko lata po https z certyfikatem SSL) to jesli bede w apce wyciagla user id z firebase i przesylal go w headerze do php (SSL) to bedzie mozliwy i tak do wyciagniecia przez osoby postronne? hmm kurde nie wiem jak sie zabezpeczyc aby nie szlo symulować nieporządanych wywołań

Nie da się. Pytanie czemu ci tak na tym zależy? Możesz wymyślać różne "zabezpieczenia", ale one tylko sprawią, że podszywanie się będzie upierdliwe, ale nie niemożliwe.

0

Firebase Auth z tego co kojarzę głównie służy do autentykacji z kombajnem Firebase. Jeżeli chciałbyś mieć jeszcze pośredni serwer, to musiałby służyć jako proxy do modułu autentykacji Firebase. Klient by najpierw wysłał dane dostępowe. Twój serwer by je przekierował do Firebase'a, otrzymał token i zwrócił go klientowi. Potem klient w każdym zapytaniu wysyłał token, a Twój serwer przed wykonaniem jakichś operacji by najpierw pytał Firebase'a czy token jest poprawny. Możesz ewentualnie pominąć krok z otrzymywaniem tokena od Twojego serwera i otrzymać go w kliencie bezpośrednio z Firebase SDK i potem korzystać z tego tokena do zapytań. Zobacz całą sekcję admin najlepiej - https://firebase.google.com/docs/auth/admin/verify-id-tokens.

Wydaje mi się, że nie ma gotowego SDK do Firebase na PHP. Może są jakieś rozwiązania innych firm niż Google, ale musiałbyś sam poszukać. Lepiej by się tu sprawdził pewnie Node.JS, bo Firebase ma ogrom integracji pod niego. Pytanie czy potrzebujesz w ogóle Firebase? Nie znam frameworków PHP, ale jestem pewien, że oferują gotowe rozwiązania do autentykacji. Pewnie są nawet takie, które automatycznie pozwalają korzystać z OAutha od Googla czy Facebooka.

0

Może opiszę ogólnie o co chodzi w mojej aplikacji a raczej grze. Mam wirtualną walutę którą można doładować kupując za prawdziwe pieniadze paczki tej waluty oraz chcę mieć możliwość zdobycia darmowych wirtualnych pieniedzy za oglądanie reklam (video ads rewards). O problem polega na tym aby jakos monitorować że gracz zobaczył filmik reklama została zaliczona i przydzielić mu "wirtualną walutę". Gdzieś muszę trzymać obecną ilość wirtualnej waluty gracza i w tym miejscu ją zwiększać. Jak to ogarnąć aby nie mógł "bokiem" przemycić punktów czy udawanych wyswietlen reklam.

0

Lub co sądzicie aby nie bawić się w resty zewnetrzne tylko wykorzystać firebase realtime database albo cloud store dostępnego z googla? Mają wbudowane api przez które łaczy się aplikacji i z tego jak rozumiem weryfikacja aplikacji jest po odcisku SHA1 aplikacji

0

Ogarnia ktos czy ten odcisk aplikacji (oferowana baza firebase) bedzie wystarczajaca aby zabezpieczyc danne przed osobai ktore by chcualy je edytować? przez np edytowanie kodu aplikacji lub w inny sposob? (chyba po dekompilacji i kompilacji po edycji i tak apka by miala inny odcisk juz ktory nie bylby akceptowany przez firebase?)

0

Wg. mnie przesadzasz. Niech połączenie z API wymaga klucza user - unikalneID generowane w API - to Twoje największe zmartwienie. Po stronie API decyduj również jak często mogą wyświetlać się reklamy w grze. Np. co godzinę wyświetlasz przycisk "Hej, możesz obejrzeć reklamę by dostać x punktów"... Lub oczywiście wyświetlasz ją automatycznie, ale po co wtedy nagradzać ludzi, którzy oglądają z przymusu? Ja bym nagradzał tylko tych co dobrowolnie oglądają :)

Postaraj się jakoś zablokować grę na czas reklamy, a oszustami, których będzie pewnie zapewne malutki odsetek już się nie przejmuj, bo szkoda czasu na tą walkę. Wydawaj co jakiś czas aktualizacje, żeby i oni musieli aktualizować swoje apki :)

Punkty gracza zwiększasz zawsze po stronie serwera API, inaczej być nie może.

0

Ciekawi mnie w jaki sposob sa zabezpieczone apki ktore oferuja np zarabianie kasy czy kupowanie jakis produktow za zdobyte punkty. Chodzi mi o to ze musza miec jakas porzadna weryfikacje clienta (appki) zeby nikt inny nie mogl wywolac ich udostepnionych api

0

oraz musza jakas miec zabezpieczone przed nabijaniem punktow przez inne klienty niz apka

0

Można analizować rzeczy takie jak:

  • czy użytkownik "wykonuje czynność" 24/7?
  • czy x użytkowników "wykonuje czynność" dokładnie w tym samym czasie?
  • czy użytkownik "wykonuje czynność" równo co 35 sekund z marginalnym odchyleniem?
  • czy w danym obszarze geograficznym jest dużo więcej użytkowników niż w pozostałych?

i wiele innych i na ich podstawie można wykryć oszustów.
Można wstawić captchę do rozwiązania co 10/100 obejrzanych reklam. Zwykłemu userowi raczej to nie będzie przeszkadzać, oszustom utrudni działanie. Podkreślam utrudni, a nie uniemożliwi, bo nie da się zrobić zabezpieczenia idealnego.

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