Come evitare che il tuo gioco web JavaScript / HTML5 venga copiato o modificato?


45

Sono nel mezzo della pianificazione di un gioco creato utilizzando JavaScript e HTML5.

Ho difficoltà a capire come potresti impedire a qualcuno di copiare semplicemente JavaScript dal server web e di creare il proprio gioco con esso (non la mia più grande preoccupazione), o di sostituire le proprie funzioni JavaScript e di sperare in clienti affidabili nel selvaggio se alla fine il gioco dovesse supportare il multiplayer.

Si può fare qualcosa per impedire a chiunque di leggere JavaScript?

In caso contrario, tutta l'elaborazione del gioco dovrebbe avvenire su un server da qualche parte con le sole responsabilità del cliente catturare l'input dell'utente e disegnare la grafica?


22
Il tuo ultimo paragrafo dice che è giusto, è vero per le app aziendali, ed è vero per i giochi, considera sempre il client come ostile.
Nate,

4
Se riesco a leggerlo, il mio browser ne ha già una copia. Quindi posso anche salvarlo da qualche altra parte. Tutto ciò che si consente di leggere, può anche essere copiato.
BerggreenDK,

Risposte:


44

Conserva tutti i dati di gioco e le logiche sul server. Parte del gioco che si trova sul lato client può essere copiata usando comunque gli strumenti appropriati (anche se è in Flash o Java), quindi accettalo e non preoccuparti troppo.

Per mantenere il tuo javascript meno copiabile, a causa della scarsa leggibilità, puoi minimizzarlo . Questa è una buona pratica in quanto rende più veloce il download del sito di gioco.


4
A seconda delle pratiche di codifica, anche tutto il contenuto sul server può essere compromesso. Minimizzare il codice e offuscare scoraggia solo quelli che non vogliono prendersi il tempo e mappare logicamente ciò che sta facendo. In conclusione, se sei preoccupato per i diritti di proprietà intellettuale del tuo codice; non metterlo sul web.
John,

1
Ciò non significa che non dovresti minimizzare, che scoraggia le persone pigre. Puoi anche provare a elaborare la logica di gioco sul server e restituire oggetti json tramite ajax, ma il ritorno può ancora essere visualizzato con firebug. Offusca la tua versione di produzione ma tieni una versione di commento pesantemente per te (questo rende più difficile da mantenere). Puoi fare cose per scoraggiare le persone, ma non è mai sicuro al 100%.
John,

3
Infatti. L'espansione del codice minimizzato non richiede nemmeno molto sforzo. jsbeautifier.org
James,

@Giovanni, tieni presente che a volte scoraggiare le persone pigre è irrilevante, poiché alcuni giochi vengono rovinati una volta che appare un singolo imbroglione, quindi non è rilevante se solo uno o molti imbrogliano.
o0 '.

11

come potresti impedire a qualcuno di copiare semplicemente il JavaScript dal server web e di creare il proprio gioco (non la mia più grande preoccupazione)

Questo è dove la legge aiuta. In pratica ciò non sembra accadere molto spesso.

o sostituendo le proprie funzioni JavaScript e liberando ogni speranza per clienti affidabili in libertà se il gioco dovesse infine supportare il multiplayer.

Non ci sono clienti affidabili in natura, esattamente per questo tipo di ragione. Rinuncia a questo sogno ora. :)


La legge non sarà molto utile quando il sito che lo ospita si trova in un paese a cui non importa molto dei diritti di proprietà intellettuale o che è comunque antagonista al tuo paese per qualsiasi motivo. Anche quando non è così, il costo per avviare un'azione legale (potenzialmente internazionale) è probabilmente molto al di là delle risorse finanziarie di qualcuno che farebbe questa domanda qui.
Paul Legato,

L'intento della risposta non era tanto quello di raccomandare azioni legali, ma di suggerire che tentare di bloccare tale software fosse per lo più inutile, almeno in parte perché molte persone che lo avrebbero copiato sono scoraggiate dalla legge, ma anche perché i clienti può essere decodificato indipendentemente dal fatto che utilizzino Javascript o meno.
Kylotan,

8

Proprio come tutti gli altri hanno raccomandato; mantenere il maggior codice possibile sul lato server.

Un metodo che ho usato per gestire la copia del codice è un po 'strano, ma finora ha funzionato bene.

  • Sul lato server, genera un ID univoco e memorizzalo per dopo.
  • Sul lato server, aggiungi un ID univoco nell'elemento script durante il rendering html.
  • Lato client, crea una connessione WebSocket e passa l'ID univoco al server.
  • Sul lato server, confronta l'id con l'elenco corrente.
  • Se la corrispondenza non viene trovata, chiudere la connessione.
  • Se viene trovata una corrispondenza , sostituisci il gestore messaggi con quello "corretto" e scarta l'id.
  • Trasmetti il ​​tuo codice segreto al client come JSON, {"func": "function () {dostuff ();}"}
  • Lato client, cerca i messaggi, se contengono "func", valutalo.

Ora il tuo codice segreto è in esecuzione sul lato client e non verrà visualizzato in view-source o ispettori / console. Ci sono ancora modi per ottenere il codice, ma è un po 'più difficile.


Se avessi bisogno di prendere qualcosa dalla soluzione sopra; Collegherei anche WebSocket vero e proverei a creare un "client falso", o utilizzare uno strumento di debug di Firebug in un browser e fermare lo script per verificare i valori.
BerggreenDK,

Non è possibile creare un client falso a meno che non sia possibile prevedere in qualche modo quali ID univoci sono attualmente disponibili, poiché vengono generati al momento del caricamento della pagina e lanciati al momento della connessione dello script. Inoltre, interrompere la sceneggiatura e guardare i valori è difficile, dal momento che stai valutando una funzione anonima. Come ho detto, ci sono ancora modi per ottenere il codice, è solo più difficile. Per la maggior parte, abbastanza in modo che il codice sia "abbastanza sicuro". Non puoi fare molto di più con questo codice lato client.
Stephen Belanger,

Sarebbe abbastanza facile scrivere un client falso che carica il client reale dal server e ne estrae il valore segreto corrente ogni volta che si avvia.
Paul Legato,

Non direi che è "facile" tanto quanto "non impossibile". Come ho detto, ci sono modi per aggirarlo. Non esiste un sistema perfettamente sicuro. Solo interfacce adeguatamente oscurate in modo tale che la maggior parte troverà troppo sforzo per hackerare. In questo caso, dovresti trasmettere frammenti di codice, quindi un hacker dovrebbe creare un client per ricevere e disporre il codice in una struttura utile. Trasmetteresti il ​​codice quando ti serve, così l'hacker non avrebbe accesso immediato al dump del codice completo.
Stephen Belanger,

3

L'unico modo per essere ragionevolmente sicuri che il tuo codice di gioco sia sicuro è costruire un tipo di gioco client / server e inserire più codice che puoi sul server. E, naturalmente, rendi sicuro quel server!

Il problema principale è che se il codice è in esecuzione sul mio computer, posso controllarlo, decompilarlo e capire come funziona. Questo è vero per JavaScript, Flash, C ++ e qualsiasi altra cosa. In effetti, nello sviluppo di MMO (che è dove la maggior parte della mia esperienza professionale) il presupposto fin dall'inizio è che il cliente è compromesso: qualunque cosa tu abbia scritto per il cliente è già nelle mani di chiunque lo desideri, malizioso o non.

Il codice di minimizzazione fornisce una piccola quantità di protezione contro le persone che sono troppo pigre per annullarlo usando uno dei tanti strumenti disponibili. (Ma il codice di produzione dovrebbe essere minimizzato per ridurre la sua impronta di dati.)

Ma se ti trovi in ​​una situazione in cui, per esempio, il tuo capo desidera una sorta di protezione del codice, puoi cercare su Google "Javascript offuscatore" - ci sono molti software gratuiti e a pagamento che rendono JS almeno altrettanto impervio decompilare come è Flash.


Voglio solo sottolineare che C ++ non è allo stesso livello di Javascript. Il C ++ viene compilato in assembly, che qualcuno deve leggere per comprendere la logica di un gioco. Ogni istruzione in C ++ può creare più righe in assembly, il che la rende un'attività che richiede molto tempo. Offuscare javascript non è lo stesso, poiché è la stessa lingua. Chiunque può "abbellirlo" e iniziare a leggere dichiarazioni quasi leggibili dall'uomo.
TomTsagk,

3

A parte tutto questo parlare di offuscamento del codice, assicurati di mettere una dichiarazione di copyright molto chiara nella parte superiore di ogni file e rendi ovvio che la licenza non consente l'alterazione o l'uso commerciale. Questo ti dà ricorso legale se qualcuno tenta di copiarlo. Se non sei disposto a presentarti in giudizio, l'intera questione è per lo più accademica.


Questo va bene per quello che vale, ma non è molto. Il concetto di proprietà intellettuale non è in pratica riconosciuto in molti paesi e, in ogni caso, i costi legali di un procedimento giudiziario sono probabilmente molto al di là di quanto sia disponibile un poster di questo sito, in particolare se l'attaccante si trova in un altro paese.
Paul Legato,

0

Penso che se rendi il tuo gioco multigiocatore, il che comporta il mantenimento della logica di gioco nel server, probabilmente lo renderebbe almeno meno allettante da rubare. Non puoi fidarti davvero del cliente. Come qualcuno ha già detto, ci sono strumenti anche per linguaggi compilati come Java e Flash, che possono decodificare il testo del codice dal codice byte.


-1

Devi usare un minificatore Javascript. Esistono molte opzioni disponibili per trovarne una che ti piace. Per salvarti un po 'di ricerca, eccone uno che potresti provare Yahoo Minifier . Non l'ho eseguito io stesso, ma presumo che farà ciò di cui hai bisogno. L'obiettivo è 1) ridurre le dimensioni del file e 2) offuscare il codice. Ciò si ottiene rimuovendo tutti gli spazi bianchi, i commenti e sostituendo i nomi delle variabili con quelli più brevi e senza senso.

Oggi la maggior parte delle applicazioni Web ha una notevole quantità di Javascript e utilizza strumenti come questi per cercare di proteggere il proprio IP. Come altri hanno già detto, dovresti sempre chiedere "Posso fare questo sul server?" per operazioni importanti o sensibili, ma credo che ciò dovrebbe offrire una certa protezione.


7
La sicurezza per oscurità oscura il potenziale per la sicurezza. :)
Rushyo,

1
Oh per favore. Ho sempre sentito questa citazione, ma non è assolutamente vero. A dire la verità, oscurare la JS avrebbe almeno dissuaso alcune persone.

2
il minificatore non lo aiuta. Credo che la maggior parte delle persone "serie" sappia come "espandere" di nuovo quegli script.
BerggreenDK,

1
@Sergio: senti sempre questa citazione perché, sai, è vera . Deterrà "alcune" persone, vere, ma scoraggiare "alcune" persone è inutile: quando vieni incrinato una volta , scendi.
o0 '.

-1

Utilizza il compilatore di chiusura di Google http://code.google.com/closure/compiler/ Non è solo un minimizer js;)

Quali sono i vantaggi dell'utilizzo del compilatore di chiusura?

  1. Efficienza. Il compilatore di chiusura riduce le dimensioni dei file JavaScript e li rende più efficienti, aiutando l'applicazione a caricarsi più velocemente e riducendo le esigenze di larghezza di banda.

  2. Verifica del codice Il compilatore di chiusura fornisce avvisi per JavaScript illegale e avvisi per operazioni potenzialmente pericolose, aiutandoti a produrre JavaScript meno difettoso e più facile da mantenere.


-1

Oppure potresti usare qualcosa come Game Maker HTML5 per creare il tuo gioco che offuscherà il codice per te. Ciò significa che renderà il codice illeggibile per l'uomo. E sarà quasi impossibile modificarlo.


2
-1 L'offuscamento andrà solo così lontano. Certamente non proteggerà il gioco dall'essere copiato o alterato - come è stato menzionato nelle altre risposte offuscate a questa domanda.
doppelgreener,

-1

Qualunque cosa proprietaria dovrebbe essere mantenuta sul lato server. Per quanto riguarda il lato client, ne fornisci abbastanza per facilitare il loro utilizzo del gioco.


-1

Mettere tutto sul server potrebbe avere problemi di prestazioni e non usare davvero tutto il potenziale del Web come lo conosciamo oggi.

Puoi scrivere il tuo codice in c ++ e compilarlo in binari.

Native Client (NaCl).

Vedi https://stackoverflow.com/questions/9018537/how-to-run-c-programs-on-the-web-inside-a-browser


Benvenuti in GDSE. OP chiede specificamente JavaScript; quindi mentre potrebbero forse riscrivere in C ++ e usare NaCl, quella soluzione non risponde davvero alle esigenze come indicato. Inoltre, le risposte dovrebbero essere autosufficienti quanto ragionevolmente possibile: menzionare NaCl e scaricare un collegamento non è buono quanto offrire un riassunto su cosa sia NaCl o perché potrebbe essere d'aiuto.
Pikalek,
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.