Alcune cose da notare qui.
In primo luogo, le richieste del server per qualcosa di simile dovrebbero essere POST, non GET. Solo le richieste GET dovrebbero essere idempotenti, e il fatto di non farlo è in realtà a violation of the HTTP specification.
In secondo luogo, quello che stai guardando qui è il classico Problema di affidabilità del client. È necessario a fidarsi del client per inviare i punteggi o altre informazioni di gioco-intervallo al server, ma non si desidera che il client di inviare i dati illegittimi. Prevenire le azioni non consentite è facile, ma impedire che i dati di foul-play in un'azione consentita siano molto più problematici.
Ben S è un ottimo punto su come si progettano i protocolli di comunicazione tra un client e un server come questo. Permettere valori del punto da inviare come dati di fiducia è generalmente sarà una cattiva idea. È preferibile indicare che è stata eseguita un'azione e lasciare che il server mostri quanti punti assegnare, se non del tutto. Ma a volte non puoi andare in giro. Considera lo scenario di un gioco di corse. Il client ha per inviare l'ora dell'utente e non può essere estratto in un'altra chiamata come "completatoLivelloFour". Quindi cosa fai adesso?
L'approccio token che Ahmet e Dean suggeriscono è suono - ma non è perfetto. In primo luogo, il token ancora deve essere trasmesso al cliente, che significa che è rilevabile dal potenziale attaccante e potrebbe essere usato maliziosamente. Inoltre, cosa succede se la tua API di gioco deve essere stateless? Ciò significa che l'autenticazione token basata su sessione è fuori. E ora entri nelle profondità e nelle tenebre del Problema della Client Trust.
C'è pochissimo che puoi fare rendilo sicuro al 100%. Ma puoi renderlo molto scomodo per imbrogliare. Considera il modello di sicurezza di Facebook (ogni richiesta API è firmata). Questo è abbastanza buono e richiede che l'utente malintenzionato scriva effettivamente nel codice lato client prima di poter capire come spoofare un reqeust.
Un altro approccio è la ripetizione del server. Come per un gioco di corse, invece di avere solo un valore di "tempo" inviato al server, avere dei checkpoint che registrano anche il tempo e li inviano tutti. Stabilire minimi realistici per ciascun intervallo e verificare sul server che tutti questi dati rientrino nei limiti stabiliti.
Buona fortuna!
fonte
2009-11-16 21:40:01
L'applicazione deve sapere se tale azione è consentita. – Gumbo
Qualcuno potrebbe semplicemente inviare la sequenza di richieste al server che consente loro di arrivare al punto in cui tale azione è consentita anche se – user105033
Quindi il server non dovrebbe effettivamente fornire i punti. –