¿Cómo evita que su juego web JavaScript / HTML5 sea copiado o alterado?

45

Estoy a punto de planear un juego creado con JavaScript y HTML5.

Tengo problemas para comprender cómo podría evitar que alguien simplemente copie el JavaScript del servidor web y cree su propio juego con él (no es mi mayor preocupación), o sustituya sus propias funciones de JavaScript y deseche cualquier esperanza de clientes confiables en el salvaje si el juego fuera eventualmente compatible con el modo multijugador.

¿Se puede hacer algo para evitar que cualquiera lea el JavaScript?

Si no es así, ¿todo el procesamiento del juego debería tener lugar en un servidor en algún lugar con las únicas responsabilidades del cliente de capturar la entrada del usuario y dibujar gráficos?

cristiano
fuente
22
Su último párrafo lee sobre lo correcto, es cierto para las aplicaciones de negocios y es cierto para los juegos, siempre trate al cliente como hostle.
Nate
44
Si puedo LEERlo, mi navegador ya tiene una copia. Entonces también puedo guardarlo en otro lugar. Cualquier cosa que permita que se lea, también se puede copiar.
BerggreenDK

Respuestas:

44

Mantenga todos los datos y lógicas del juego en el servidor. Parte del juego que está en el lado del cliente se puede copiar utilizando las herramientas apropiadas de todos modos (incluso si está en Flash o Java), así que simplemente acéptelo y no se preocupe demasiado.

Para mantener su JavaScript menos copiable, debido a la mala legibilidad, puede minimizarlo . De todos modos, es una buena práctica, ya que hace que el sitio de juegos se descargue más rápido.

Aidas Bendoraitis
fuente
44
Dependiendo de las prácticas de codificación, todo el contenido del servidor también puede verse comprometido. Para minimizar el código y ofuscar solo disuade a aquellos que no quieren tomarse el tiempo y lógicamente mapear lo que está haciendo. La conclusión es, si está preocupado por los derechos de propiedad intelectual de su código; no lo pongas en la web.
John
1
Eso no significa que no debas minificar, eso disuade a la gente perezosa. También puede intentar procesar la lógica del juego en el servidor y devolver objetos json a través de ajax, pero la devolución aún se puede ver con firebug. Ofusque su versión de producción pero conserve una versión con muchos comentarios para usted (esto hace que sea más difícil de mantener). Puede hacer cosas para disuadir a las personas, pero nunca es 100% seguro.
John
3
En efecto. La expansión del código minificado ni siquiera requiere mucho esfuerzo. jsbeautifier.org
James
@John, tenga en cuenta que a veces disuadir a las personas perezosas es irrelevante, ya que algunos juegos se arruinan una vez que aparece un solo tramposo, por lo que no es relevante si solo uno o muchos están haciendo trampa.
o0 '.
11

cómo podrías evitar que alguien simplemente copie el JavaScript del servidor web y que haga su propio juego con él (no es mi mayor preocupación)

Aquí es donde la ley ayuda. En la práctica, esto no parece suceder muy a menudo.

o sustituyendo sus propias funciones de JavaScript y eliminando cualquier esperanza de clientes confiables en la naturaleza si el juego eventualmente admitiera el modo multijugador.

No hay clientes confiables en la naturaleza, exactamente por este tipo de razón. Renunciar a este sueño ahora. :)

Kylotan
fuente
La ley no será de mucha utilidad cuando el sitio que lo aloja se encuentre en un país que no se preocupe demasiado por los derechos de propiedad intelectual, o que sea antagónico a su país por cualquier razón. Incluso cuando ese no sea el caso, el costo de iniciar una acción legal (potencialmente internacional) probablemente esté mucho más allá de los recursos financieros de alguien que haría esta pregunta aquí.
Paul Legato
La intención de la respuesta no era tanto recomendar acciones legales, sino sugerir que tratar de bloquear dicho software no tiene sentido, al menos en parte porque muchas de las personas que lo copiarían están desalentadas por la ley, sino también porque los clientes se puede realizar ingeniería inversa si usan Javascript o no.
Kylotan
8

Tal como todos los demás lo han recomendado; mantener tanto código como sea posible del lado del servidor.

Un método que he usado para manejar la copia de código es un poco extraño, pero ha funcionado bien hasta ahora.

  • Del lado del servidor, genere una identificación única y almacénela para más adelante.
  • Del lado del servidor, agregue una identificación única en el elemento del script durante la representación html.
  • Del lado del cliente, cree una conexión WebSocket y pase la identificación única al servidor.
  • Del lado del servidor, haga coincidir la identificación con la lista actual.
  • Si no se encuentra coincidencia, cierre la conexión.
  • Si se encuentra una coincidencia , reemplace el controlador de mensajes con el "correcto" y descarte la identificación.
  • Transmita su código secreto al cliente como JSON, {"func": "function () {dostuff ();}"}
  • Del lado del cliente, esté atento a los mensajes, si contienen "func", evalúelo.

Ahora su código secreto se está ejecutando en el lado del cliente y no aparecerá en view-source o en inspectores / consolas. Todavía hay formas de llegar al código, pero es bastante más difícil.

Stephen Belanger
fuente
Si necesito tomar algo de la solución anterior; También conectaría WebSocket verdadero e intentaría hacer un "cliente falso", o usaría una herramienta de depuración de Firebug en un navegador y simplemente detendría el script para verificar los valores.
BerggreenDK
No puede crear un cliente falso a menos que pueda predecir de algún modo qué identificadores únicos están disponibles actualmente, ya que se generan en el momento de la carga de la página y se lanzan en el momento de la conexión del script. Además, detener el script y mirar los valores es difícil, ya que está evaluando una función anónima. Como dije, todavía hay formas de llegar al código, es más difícil. En su mayor parte, suficiente para que su código sea "lo suficientemente seguro". No se puede hacer mucho más que eso con el código del lado del cliente.
Stephen Belanger el
Sería bastante fácil escribir un cliente falso que solo carga el cliente real del servidor y elimina el valor secreto actual cada vez que se inicia.
Paul Legato
No diría que es "fácil" tanto como "no imposible". Como dije, hay formas de evitarlo. No existe un sistema perfectamente seguro. Solo interfaces oscurecidas de manera adecuada para que la mayoría encuentre demasiado esfuerzo para hackear. En este caso, estaría transmitiendo bits de código, por lo que un pirata informático necesitaría crear un cliente para recibir y organizar el código en una estructura útil. Transmitiría el código según lo necesite, para que el pirata informático no tenga acceso inmediato al volcado de código completo.
Stephen Belanger
3

La única forma de estar razonablemente seguro de que su código de juego será seguro es crear un tipo de juego cliente / servidor y poner tanto código como sea posible en el servidor. Y, por supuesto, ¡asegure ese servidor!

El problema principal es que si el código se está ejecutando en mi computadora, puedo inspeccionarlo, descompilarlo y descubrir cómo funciona. Esto es cierto para JavaScript, Flash, C ++, cualquier otra cosa. De hecho, en el desarrollo de MMO (que es donde está la mayor parte de mi experiencia profesional) la suposición desde el principio es que el cliente está comprometido: lo que haya escrito para el cliente ya está en manos de quien lo desee, malicioso o no.

El código minificador proporciona una pequeña cantidad de protección contra las personas que son demasiado vagas para desminificarlo usando una de las muchas herramientas disponibles. (Pero el código de producción debe minimizarse para reducir su huella de datos).

Pero si se encuentra en una situación en la que, por ejemplo, su jefe quiere algún tipo de protección de código, puede buscar en Google "Javascript ofuscador": hay una gran cantidad de software gratuito y de pago que hace que JS sea al menos tan impermeable. para descompilar como Flash.

DariusK
fuente
Solo quiero señalar que C ++ no está en el mismo nivel que Javascript. C ++ se compila en el ensamblaje, que alguien debe leer para comprender la lógica de un juego. Cada instrucción en C ++ puede crear varias líneas en el ensamblaje, lo que la convierte en una tarea que consume mucho tiempo. Ofuscar JavaScript no es lo mismo, ya que es el mismo idioma. Cualquiera puede "embellecerlo" y comenzar a leer declaraciones casi legibles por humanos.
TomTsagk
3

Además de toda esta charla sobre la ofuscación del código, asegúrese de poner una declaración de derechos de autor muy clara en la parte superior de cada archivo y hacer obvio que la licencia no permite la alteración o el uso comercial. Esto le brinda un recurso legal si alguien intenta copiarlo. Si no está dispuesto a ir al tribunal por ello, entonces toda esta pregunta es principalmente académica.

coderanger
fuente
Esto está bien para lo que vale, pero eso no es mucho. En la práctica, el concepto de propiedad intelectual no se reconoce en muchos países, y en cualquier caso los costos legales de un caso en la corte probablemente estén mucho más allá de lo que tiene disponible un póster en este sitio, particularmente si el atacante está en otro país.
Paul Legato
0

Creo que si haces que tu juego sea multijugador, lo que implica mantener la lógica de tu juego en el servidor, probablemente harás que sea al menos menos atractivo robar. No puedes confiar en el cliente realmente. Como alguien ya ha mencionado, existen herramientas incluso para lenguajes compilados como Java y Flash, que pueden realizar ingeniería inversa del texto del código a partir del código de bytes.


fuente
-1

Necesitas usar un Javascript Minifier. Hay muchas opciones disponibles, no dude en encontrar una que le guste. Para ahorrarle algo de investigación, aquí puede probar Yahoo Minifier . No lo he ejecutado yo mismo, pero supongo que hará lo que necesita. El objetivo es 1) reducir el tamaño del archivo y 2) ofuscar el código. Esto se logra eliminando todos los espacios en blanco, comentarios y reemplazando nombres de variables con nombres más cortos y sin sentido.

La mayoría de las aplicaciones web actuales tienen una cantidad significativa de Javascript y utilizan herramientas como estas para tratar de proteger su IP. Como otros han dicho, siempre debe preguntar: "¿Puedo hacer esto en el servidor?" para operaciones importantes o sensibles, pero creo que esto debería ofrecer cierta protección.

Alex Schearer
fuente
77
La seguridad por oscuridad oscurece el potencial de seguridad. :)
Rushyo
1
Oh por favor. Escucho esta cita todo el tiempo, pero no es del todo cierto. A decir verdad, ocultar el JS al menos disuadiría a algunas personas.
2
El minificador no lo ayuda. Creo que la mayoría de las personas "serias" saben cómo "expandir" esos guiones nuevamente.
BerggreenDK
1
@ Sergio: escuchas esta cita todo el tiempo porque, ya sabes, es verdad . Va a disuadir a "algunas" personas, es cierto, pero disuadir a "algunas" personas no tiene sentido: cuando estás agrietado una vez , caes.
o0 '.
-1

Utilice el compilador de cierre de Google http://code.google.com/closure/compiler/ No es solo un js minimizer;)

¿Cuáles son los beneficios de usar Closure Compiler?

  1. Eficiencia. El compilador de cierre reduce el tamaño de sus archivos JavaScript y los hace más eficientes, ayudando a que su aplicación se cargue más rápido y reduciendo sus necesidades de ancho de banda.

  2. Comprobación de código. El Compilador de cierre proporciona advertencias para JavaScript ilegal y advertencias para operaciones potencialmente peligrosas, ayudándole a producir JavaScript que tenga menos errores y sea más fácil de mantener.

Deyaa
fuente
-1

O puede usar algo como Game Maker HTML5 para crear su juego que ofuscará el código por usted. Eso significa que hará que el código sea ilegible para los humanos. Y será casi imposible de editar.

Gwhiz
fuente
2
-1 La ofuscación solo llegará hasta cierto punto. Ciertamente no protegerá el juego de ser copiado o alterado, como se ha mencionado en las otras respuestas de ofuscación a esta pregunta.
doppelgreener
-1

Cualquier propiedad debe mantenerse en el lado del servidor. Del lado del cliente, solo proporciona lo suficiente para facilitar su uso del juego.

Costa de Edward
fuente
-1

Poner todo en el servidor podría tener problemas de rendimiento y no utilizar todo el potencial de la web tal como lo conocemos hoy.

Puede escribir su código en c ++ y compilarlo en binarios.

Cliente nativo (NaCl).

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

yehuda mazal
fuente
Bienvenido a GDSE. OP pregunta específicamente sobre JavaScript; entonces, aunque tal vez podrían volver a escribir en C ++ y usar NaCl, esa solución realmente no aborda las necesidades como se indicó. Además, las respuestas deben ser tan independientes como sea razonablemente posible: mencionar NaCl y eliminar un enlace no es tan bueno como ofrecer un resumen de qué es NaCl o por qué podría ayudar.
Pikalek