Le moyen le plus sûr de mettre à jour le score du jeu de la base de données client vers le serveur? Javascript

J'ai donc ce jeu qui est complètement exécuté sur le client. Pas d'interaction avec le serveur, ce qui ne fait jamais partie du téléchargement des scripts initiaux pour jouer au jeu. Quoi qu'il en soit, à la fin du jeu, j'aimerais que le client me renvoie les scores qui doivent être mis à jour dans la base de données du serveur. Maintenant, je suis venu à accepter le fait qu'il n'y a aucun moyen sur la Terre, je peux cacher cela à un pirate informatique et envoyer les scores inchangés. Mais j'aimerais savoir jusqu'à quel niveau puis-je modifier tout le processus qu'il devient pratiquement impossible pour le piratage de manipuler les données qui sont envoyées. Bien sûr, je ne voudrais pas que le score soit envoyé en texte clair à partir de la machine client et je ne souhaite pas que mon serveur effectue un algorithme de décryptage complexe. Quelle est la meilleure façon d'obtenir une quantité considérable de sécurité que chaque Tom Dick et Harry ne piratent pas les scores … J'espère que quelqu'un pourrait fournir un bon moyen sur lequel je pourrais travailler … 🙂 Merci

Donc, mon résultat idéal devrait être -> avoir un résultat de confiance à partir d'un calcul (de score) réalisé par une fête non-approuvée (le joueur)!

-Modifier-

Quelqu'un m'a dit quelque chose à propos de cacher les données dans une photo demander. J'aime, je met en œuvre ce jeu sur toile (html5). Donc, il m'a demandé à la fin du jeu de récupérer un jeu sur l'image de mon serveur, et ils demandent devraient contenir le score haché. Je n'ai pas bien compris le processus complet, mais si vous pouviez l'expliquer, serait vraiment heureux! 🙂

Coda ^ afin que vous puissiez masquer les requêtes bien

Shouvik comment je le fais!?

Coda ^ vous pouvez composer la somme de contrôle que vous souhaitez soumettre. Comme 12312312a12313a232 est votre md5 qui contient le score. Apporter un atout dans le canevas comme

Coda ^ server.com/images/md5_hash_of_score/congratulations.png

Coda ^ que vous pouvez réécrire côté serveur via htaccess

"Maintenant, je suis venu à accepter le fait qu'il n'y a aucun moyen sur terre, je peux cacher cela à un pirate informatique et envoyer les scores inchangés".

Oh oui, il y a!

Vous pouvez utiliser RSA ou toute autre méthode de cryptage de clé publique (également appelée cryptographie assymetrique).

Créez un ensemble de clés (publiques et privées) pour le serveur. Demandez à votre code client d'inclure la clé publique de votre serveur.

À la fin du jeu, le code client, crypte le score (avec cette clé) et envoie les deux (score simple et score crypté) au serveur.

Le serveur décrypte et vérifie si le score simple et décrypté est identique. Si oui, acceptez le score. Sinon, rejeter (il y a un pirate ou une erreur de réseau au milieu).

——- MISE À JOUR ———– CORRECTION ————–

Comme Ambrosia l'a souligné, mon approche échoue complètement avec ce type d'attaque.

Ce que vous voulez réellement, c'est d'avoir un résultat de confiance à partir d'un calcul (du score) effectué par une partie non confiée (le joueur). Pas de moyen facile d'y parvenir.

Voir ceci: http://coltrane.wiwi.hu-berlin.de/~fis/texts/2003-profit-untrust.pdf

Également celui-ci: http://www.cse.psu.edu/~snarayan/publications/securecomputation.pdf

Et ceci (qui nécessite un abonnement à la bibliothèque numérique ACM): http://portal.acm.org/citation.cfm?id=643477.643479

Vous semblez déjà le savoir, mais juste pour vous stresser; Vous ne pouvez pas empêcher quelqu'un de faire cela; Vous ne pouvez que le rendre aussi difficile que possible!

Supposons que vous soumettez actuellement le score comme suit:

/submit_score.php?score=5 

Quelqu'un qui regarde dans Firebug peut facilement distinguer où le score est soumis et le modifier. submit_score.php abandonne, de même que le nom du paramètre. Le score est un nombre entier facilement distinguable.

  1. Modifiez le point final: /interaction.php?score=5
  2. Modifiez le nom du paramètre: /interaction.php?a=5

Il devient de plus en plus difficile pour l'utilisateur de déterminer ce qui se passe.

Maintenant, vous pouvez rendre le score plus difficile (encore une fois, plus difficile, pas impossible), à ​​changer. Tout d'abord, vous pouvez le crypter (évidemment, vous devrez le décrypter plus tard).

  1. Base 64 l'encode.
  2. Numéros -> Lettres (1 = a, 2 = b, etc.).
  3. Inverser l'ordre de la représentation du score.

Vous le nommez, vous le faites. Donc, vous avez maintenant interaction.php?a=e .

La prochaine chose que vous pouvez faire est de hacher le score avec autre chose. Envoyer le hash avec le score et le recalculer sur le serveur. Par exemple, md5() le score avec une chaîne aléatoire, et envoyer le score (encodé), la chaîne et le hash dans la requête:

 /interaction.php?a=e&str=abcde&hash=123456789abcefbc 

Lorsque la demande frappe le serveur, effectuez:

 if (md5($_GET['a'] . $_GET['str']) !== $_GET['hash']) exit; 

Évidemment, les gens peuvent (relativement) passer facilement par votre code JavaScript et voir ce qui se passe; Donc, rendez-vous plus difficile pour eux là-bas. Minimiser et obfoncer le code.

Si vous le rendez assez difficile pour quelqu'un, ils vont essayer de comprendre votre JavaScript, essayez d'utiliser Firebug, ne comprenez pas ce qui se passe, et ne dérangez pas; Pour obtenir quelques points supplémentaires sur votre jeu.

Pouvez-vous utiliser ajax pour envoyer le score (et les identifiants) au serveur? À moins qu'ils aient quelque chose comme Firebug ouvert, ils ne le verront pas se produire.

 var url = '/savescores.asp?userID=fredsmith&score=1098'; createRequest(); request.open('GET', url, true); etc 

Faites en sorte que le client vous envoie les informations d'identification (ou une sorte d'information de session au cas où vous n'êtes pas identifié) et faites-le via SSL (https). De cette façon, vous avez à la fois un contrôle d'authentification et d'intégrité. Très facile et extrêmement léger pour le serveur et le client.