La nostra app per Android ha solo accesso a Facebook. Ecco cosa succede sul server:
-
Un utente viene creato quando una richiesta POST viene inviata utilizzando il token di accesso utente di Facebook nel corpo. Ogni volta che un utente viene creato tramite una richiesta POST, un token API viene generato e inviato come risposta come segue:
{ "message": "User Successfully Created", "api_token": "ACITyBKf0jKrfqOFumTMcaEEJ8jU151crRdESMPmBj8zbeENslULHfNXlKeo" }
L'ho fatto perché il token API generato sul server è archiviato nella memoria locale dell'app Android ed è necessario per fare altre richieste.
-
Se l'utente esiste già nel server, la risposta sarà:
{ "message": "User Already Exists!!", "api_token": "ACITyBKf0jKrfqOFumTMcaEEJ8jU151crRdESMPmBj8zbeENslULHfNXlKeo" }
Questo è il caso in cui l'utente cancelli l'app e la installi di nuovo.
-
Per inviare un punteggio, è necessario inviare una richiesta PATCH con la seguente intestazione e il corpo:
Content-Type: application/x-www-form-urlencoded api_token: ACITyBKf0jKrfqOFumTMcaEEJ8jU151crRdESMPmBj8zbeENslULHfNXlKeo fb_id: xxxxxxxxxx distance: 2 golds: 19 xp: 23
Ora, il problema è che ho individuato una scappatoia.
Una persona può scoprire in qualsiasi momento il proprio token di accesso utente di Facebook e il proprio ID di Facebook. Quindi, se fanno una richiesta POST con quel token di accesso utente, riceveranno il api_token
(nella risposta "Utente esiste già !!"). E una volta che hanno api_token
e fb_id
, possono fare una richiesta PATCH per modificare i loro punteggi a quello che vogliono.
Che cosa sto sbagliando? Come posso impedire agli utenti di modificare i loro dati in questo modo?