Sto sviluppando un'applicazione web offline (gioco) per Android che utilizza cordova (PhoneGap). La classifica della stessa viene mantenuta online nel mio server.
Attualmente questo è il modo in cui la classifica è aggiornata
Passaggio 1) Il punteggio dell'utente viene archiviato nella memoria locale dell'app offline.
Passaggio 2) L'utente preme il pulsante "aggiorna il mio punteggio" collegandosi a Internet.
Passaggio 3) Il pulsante invia sostanzialmente una richiesta Ajax a link
Passaggio 4) Sulla base di questo il database viene aggiornato nel mio server dal file scoreupdate.php e restituisce successo.
Questi sono i problemi che sto affrontando
1) Chiunque può visitare facilmente link se conosce l'id utente (può essere facilmente ottenuto dai dati di localstorage dell'app) e lui / lei può aggiornare il suo punteggio nella classifica semplicemente sostituendo il valore ottenuto con il valore alto con un valore elevato per ottenere una posizione migliore in classifica.
2) Qualsiasi valore segreto memorizzato nell'app o nella cronologia locale può essere ottenuto facilmente poiché l'intero oggetto è costruito in javascript. È anche possibile eseguire il reverse engineering dell'applicazione in modo da non riuscire a trovare un modo per autenticare in modo efficiente che sia l'app reale che sta inviando la richiesta al server e non a una persona.
I miei requisiti
1) L'app deve essere in grado di autenticare il file scoreupdate.php che è l'app reale e non una persona. In modo che solo l'app sarà in grado di aggiornare la classifica.
2) La logica dell'autenticazione non deve essere violata dall'utente semplicemente leggendo il codice sorgente dell'app. (es: moltiplicando l'id utente con alcuni numeri e facendo il processo inverso nel server non funzionerà)
C'è un modo per farlo?
Il rimescolamento di Javascript non è efficace in quanto può essere facilmente decodificato
Modifica
Non sono preoccupato se qualcuno ruba le credenziali dell'utente tramite un MITM o qualsiasi attacco di tipo bruteforce. Anche il vero utente che possiede il profilo non dovrebbe essere in grado di aggiornare il proprio punteggio.