Estoy planeando aventurarme a hacer un RPG de acción para un solo jugador en js / html5, y me gustaría evitar hacer trampa. No necesito una protección del 100%, ya que no será un juego multijugador, pero quiero algún nivel de protección.
Entonces, ¿qué estrategias sugieres más allá de minificar y ofuscar?
No me molestaría en hacer una comprobación simple del lado del servidor, pero no quiero seguir el camino de Diablo 3 manteniendo todos mis cambios de estado del juego en el lado del servidor.
Como va a ser una especie de juego de rol, se me ocurrió la idea de hacer un inspector de estadísticas que verifique los cambios abruptos en sus valores, pero no estoy seguro de qué tan consistente y confiable puede ser.
¿Qué pasa con las variables y funciones escopes? Trabajar en escopes más pequeños siempre que sea posible es más seguro, pero ¿vale la pena el esfuerzo?
¿Hay alguna forma de que el javascript inspeccione su texto, como en una suma de verificación?
¿Hay soluciones específicas para el navegador? No me molestaría en restringirlo para Chrome solo en las primeras compilaciones.
fuente
Respuestas:
La respuesta corta es que no puedes hacerlo. Cualquier cosa que se ejecute del lado del cliente, especialmente desde la fuente, se puede modificar para derrotar sus tácticas de manera trivial. Si implementa un verificador del lado del cliente para buscar cambios abruptos, un usuario puede simplemente deshabilitar el verificador.
La buena noticia es que, en general, hay muy pocas trampas en los juegos para un jugador. La única excepción importante es para los juegos que tienen grandes comunidades "youtube highscore" como Line Rider, donde los jugadores compiten entre sí en YouTube.
Si estás apuntando a eso, o eres demasiado terco para aceptar que las personas podrían hacer trampa en el juego, o estás manteniendo puntuaciones altas (que es una forma de multijugador), entonces lo que debes hacer son todos los cálculos del lado del servidor . Sí, todo lo que importa. Ni siquiera puede repetir el lado del cliente de cálculo para intentar darle al usuario el puntaje y luego 'verificarlo' con el servidor porque el usuario puede simplemente deshabilitar el cheque y deshabilitar cualquier sistema que garantice que haya cheques.
Desearía que hubiera una mejor respuesta a esto, pero no la hay.
Dicho esto, hay cosas que puedes hacer para que sea un poco más difícil hacer trampa. No detendrán a nadie serio de hacerlo y lanzar un juego de herramientas para hacer trampa, pero los ralentizará:
Asi que. Como puede ver, probablemente no valga la pena seguir esta ruta. Es difícil. Requiere muchas prácticas de codificación realmente tontas y, en última instancia, sigue siendo relativamente fácil de derrotar. Tendrá que hacer todos los cálculos del lado del servidor para evitar trampas. O déjalo ir y acepta que sucederá un engaño
fuente
Ya respondí una pregunta como esa aquí , y lamento decirlo, pero:
Es lo más malo que podrías haber dicho aquí. Si quieres hacer un motor "anti-trampa", tendrás que hacerlo. Puede agregar cualquier cosa que desee del lado del cliente, para facilitar el trabajo del lado del servidor, pero nunca debe confiar en el cliente. Toda la lógica que tenga debe ser al menos del lado del servidor. Puede reproducirlo del lado del cliente si lo desea, pero ninguna solución del lado del cliente lo hará.
Y, por cierto, si quieres encontrar la debilidad de tu programa, no lo ofusques, deja que la gente vea tu código y te diga "aquí, tienes un problema".
Eso es bueno para usted, para su código, para sus usuarios y para la comunidad.
fuente
Bueno, un buen lugar para comenzar es usar la función Object.freeze (que permitirá la protección contra parches de objetos).
Esto "evita que se agreguen nuevas propiedades", "evita que se eliminen las propiedades existentes", "evita que se cambien las propiedades existentes, o su enumeración, configurabilidad o escritura"; cualquier cambio en el estado interno debe hacerse a través de los accesores. El siguiente ejemplo funciona en Chrome (debería funcionar en Firefox, aunque no sé sobre IE ...):
fuente
Object.freeze = function(o) {};
en la consola JS.desafortunadamente, tienes que seguir el camino de diablo 3, si realmente te preocupan los hacks / trucos. si no lo está, entonces debe hacer controles básicos o se recomienda encarecidamente.
... and so on
1 point is little bit tricky is the hero's position, since you are not much worried about it you can leave it, but its better you do that too with a minimum check like one below
Hope this helps, it sounds difficult but you need to learn to make real working games
fuente
Its basically not possible. It would be so easy to work around anything you put in place to prevent cheating.
The thing is with any software you distribute people can modify it in memory easily.
Besides if they want to cheat, let them. They're just ruining the game for themselves. There's no real practical use to cheat in this situation, you'd just destroy the gameplay for yourself.
fuente
I had an idea for a measure you could take to prevent/reduce cheating (in addition to other answers). You could have it set up so that the client is not given all the source code at one time, rather that every time the client wants to, say, purchase a new item in the store, that the client would have to send certain information to the server, and only recieve all the information for whatever they are purchasing if the information all matches up with what it's supposed to. If it doesn't, the server blacklists their IP or something.
You could use this in conjunction with what Dampes8n said about using different source versions, that if you can figure out a way to generate a lot of different versions, so that each user would be running an entirely different source version each time, that failing the check blacklists that source version, too, that it won't ever give out the correct item info for that source version ever again.
The main reason this would be effective is that if a hacker doesn't get the hack right the first time, this would make it much harder for them to modify the hack, because every time the hack doesn't work perfectly, they have to change their IP and write the hack all over again for the new source version.
fuente
Yes, it can't fully be done. Always have check on the server. Anything that has an impact on the game should require authorization from the server.
That is the extend to which I will repeat other answers.
However, we can do a lot more towards the end of preventing cheats than just checking on the server. Well, we might have to add some special server checks. However, be aware that client side checks are not worthless, they save bandwidth and server work when cheaters are not involved.
With that said:
Yes, this are all mitigations. We can still have a custom made browser that will not check integrity and let you reach and mess with variables in local scopes... then the game code will send the modified data with the right token, and that is where the server checks come into play.
fuente