Protezione dei dati HTTP da un gioco JavaScript al server


8

Supponiamo che stia facendo un gioco JavaScript e vorrei che il gioco aggiornasse il server se l'utente ha completato con successo il gioco e i suoi risultati.

Come devo garantire che la richiesta provenga dal gioco JavaScript e che i dati inviati non siano stati manomessi. Sto usando PHP come lingua lato server.

Capisco che nessuna strategia sarà al 100% infallibile, e qualsiasi misura presa è più un fattore dissuasivo che una protezione assoluta.

Su Modifica: supponiamo che non stiamo utilizzando la verifica del server del passaggio di ciascun utente (come in un MMO tradizionale). Il gioco potrebbe essere un mini-gioco come parte di un gioco Web o di un gioco educativo (ad esempio invasori spaziali o un gioco in tempo reale) e richiedere un componente lato server per ciascuno di questi giochi potrebbe essere noioso.

Esempio: supponiamo che, una volta completato il gioco, una richiesta venga inviata al server tramite. AJAX

game_finished.php?user_id=1&outcome=success&score=88

Un utente potrebbe "falsificare" il server credendo che il gioco sia stato completato correttamente inviando tale richiesta a game_finished.php. Come potrebbe essere reso più difficile?

Risposte:


10

un puzzle a blocchi scorrevoli, per esempio

Questo è un esempio in cui la verifica lato server è banale. Non è necessario verificare ogni passaggio fino alla fine del gioco. Basta inviare l'intero elenco di spostamenti e il server lo riproduce per assicurarsi che sia corretto.

(Modifica: il punto di questa risposta non è scegliere esempi fino a quando non ne trovi uno che non sia banalmente validabile. Piuttosto, dovrebbe farti tornare indietro e guardare il gioco che stai effettivamente realizzando - probabilmente è banalmente validabile, o ha solo bisogno di un piccolo ritocco per essere.)


Stavo pensando all'esempio e non è il migliore degli esempi. Diciamo quindi Space Invaders. Aggiornerò la domanda.
Extrakun,

2
Tuttavia, anche il movimento di Space Invaders è totalmente deterministico. Devi solo registrare quando si verifica ogni coppia di colpi / colpi, simulare il movimento fino a quel momento (che è una semplice equazione lineare) e assicurarti che sia effettivamente un colpo.

Finalmente ho capito cosa intendi dopo averci riflettuto. Grazie
Extrakun,

Solo un'aggiunta all'aspetto "totalmente deterministico": se hai bisogno di casualità nel tuo gioco, passa un seme specifico per quella casualità al client e salva quel seme sul server. Quando il client invia il registro di gioco per conferma, il server può riprodurre anche le parti che implicano casualità. Lo stesso è possibile per i passaggi che dipendono dall'ora locale. Vedi gli algoritmi di salvataggio e caricamento di Undum ( undum.com ) come esempio di come eseguire questa operazione in JavaScript.
BerndBrot,

2

Puoi farlo nel modo Warcraft: usa Javascript solo per inviare comandi di movimento al server e lascia che il server gestisca la logica.

Questo ti lascia ancora aperto ai robot (programmi javascript che muovono le cose più velocemente e in modo più preciso di quello umanamente possibile) ma questo è un grande passo rispetto a lasciare la porta aperta al trucco /game_finished.php.


1

Se stai facendo calcolare il punteggio al client, non c'è modo di convalidarlo oltre (come indicato) che il server ripeti il ​​gioco per confermare che ottiene lo stesso punteggio.

Esistono tipi di giochi che puoi progettare che non funzionano basandosi solo su un punteggio numerico. Uno script lato server può generare, ad esempio, un problema matematico di aggiunta casuale e quando l'utente invia la risposta può confrontare la propria risposta con quella corretta e classificarla sul lato server.

Ma se il tuo gioco è complesso (come nell'esempio degli invasori spaziali), non c'è molto che puoi fare al di là di a) fidarsi del client o b) lasciare che il server gestisca il gioco.


-1

Esistono molti metodi, ma alla fine falliranno tutti. È possibile aggiungere un valore hash o una chiave di query rinnovata con ogni query.

Ma la cosa più importante è che tutte le tue funzioni di supercodifica vengono inviate come codici sorgente al browser dei clienti e questo è IL problema. Per renderlo un po 'più difficile, puoi utilizzare la funzione di invio tramite query Ajax, quindi le fonti non saranno disponibili sotto un url. La funzione deve essere compressa e forse anche in parti, quindi sarà più difficile copiarla. Verificherei anche questo codice in una pagina come http://jsbeautifier.org/ se dopo averlo reso leggibile il tuo codice è di facile comprensione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.