Rest API w PHP dla aplikacji Android

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.

Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
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

OtoKamil
  • Rejestracja:około 10 lat
  • Ostatnio:około rok
  • Postów:143
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

edytowany 2x, ostatnio: OtoKamil
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
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.

edytowany 2x, ostatnio: Michał Sikora
IT
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:261
0

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

LP
  • Rejestracja:około 7 lat
  • Ostatnio:około miesiąc
  • Postów:365
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.

Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
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ń

IT
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:261
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.

IK
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
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.

edytowany 1x, ostatnio: iksde
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
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.

edytowany 1x, ostatnio: Michał Sikora
czysteskarpety
czysteskarpety
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Piwnica
  • Postów:7697
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?)

UP
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:28
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

Patryk27
Nie istnieje takie zabezpieczenie.
0

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

IK
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
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.

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