Serveur minecraft

Gamasutra: Blog de Trond Fasteraune – Ne faites jamais confiance au client: techniques simples contre la triche en multijoueur et SpatialOS – Un bon serveur Minecraft

Le 17 juin 2019 - 11 minutes de lecture

Le blog suivant, sauf indication contraire, a été écrit par un membre de la communauté de Gamasutra.
Les pensées et opinions exprimées sont celles de l'écrivain et non de Gamasutra ou de sa société mère.


Faire des jeux multijoueurs en ligne est aujourd'hui plus facile que jamais. Vous téléchargez simplement un package sur le magasin de ressources Unity et vous êtes prêt à partir. Vous n'avez même pas besoin de connaître la programmation pour pouvoir faire fonctionner quelque chose rapidement. C'est devenu une chose du passé.

Cela présente également des aspects négatifs. De plus en plus d’entreprises de jeux vidéo indépendants ne savent pas ce qui se passe sous le capot de leur jeu en ligne. En conséquence, certains jeux publiés aujourd'hui sont totalement non optimisés et ouverts à la triche.

Dans cet article, je voudrais aborder les bases d'une chose – la prévention de la triche. Je veux vous montrer comment des techniques simples peuvent protéger votre jeu contre des attaques simples et comment l'architecture de SpatialOS peut vous aider à les surmonter.

La triche

En fonction du type de jeu que vous réalisez, il peut être une perte de temps de mettre en œuvre la prévention de la triche. Pourquoi tricher dans un jeu de société en ligne avec vos amis? Ou pourquoi tricher dans un jeu d’histoire coopératif en ligne? Les jeux sur lesquels vous devriez vous concentrer sont des jeux en ligne auxquels vous pouvez jouer avec des personnes aléatoires.

Parce que si on leur en donne la chance, les gens vont tricher. Ils vont aimer, ils vont survoler les murs, ils vont basculer, ils vont wallhack, ils vont faire équipe, ils vont empiler, ils vont booster. Le fait que le vocabulaire utilisé soit si large est en soi une indication de la portée du comportement.

Voici un exemple de triche de commutation de décalage et comment vous pouvez simplement modifier votre câble Internet pour obtenir un avantage:

De plus en plus de startups n’ont tout simplement pas les connaissances de base de la technologie réseau dans leurs jeux. Elles ont donc souvent des problèmes à résoudre, même après leur sortie. Une chose que ces jeux infidèles ont en commun est le simple fait que la confiance est donnée au client.

Vous ne devriez jamais, jamais, faire confiance au client. Vous devez supposer que tous les clients utilisent une version modifiée de leur jeu et que tous les paquets réseau envoyés par ces clients sont modifiés et malveillants. Dans cet esprit, nous espérons que les développeurs auront suffisamment peur pour devenir au moins un peu paranoïaques. La paranoïa et une appréciation des théories du complot sont un bon trait pour un programmeur de réseau.

Une conséquence de l'absence de fonctionnalités clés dans la prévention de la triche pourrait être catastrophique. En faisant les bonnes choses dans le mauvais ordre, un joueur pourrait être capable de faire tomber tout le serveur par terre.

En utilisant des outils d'usage général facilement disponibles sur Internet et quelques tutoriels sur youtube, vous êtes en mesure de récolter de nombreux fruits en termes de triche. Voici quelques exemples de simples astuces que n'importe qui peut faire en tant que client si le serveur ne le protège pas ou s'il est programmé de manière incorrecte.

  • Téléporter à une position.
  • Courez très vite.
  • Passer à travers les murs.
  • Modifier ou geler le nombre d'articles que vous avez dans votre inventaire
  • Modifiez ou gelez votre santé / armure / mana sur vous-même, vous rendant essentiellement invincible.
  • Voler dans les airs.

Si vous êtes la mauvaise personne avec les bons outils, vous pourrez peut-être aller encore plus loin. Si le serveur ne protège pas contre ces exploits, vous pourrez peut-être:

  • Dire au serveur que vous avez subi des dégâts dus à une chute sans réellement les subir
  • Dites au serveur que un autre joueur a pris des dégâts de chute. Cela permet essentiellement à un seul joueur d’effacer en quelques secondes l’ensemble de la population d’un serveur.
  • Faire apparaître des objets / projectiles à n’importe quel endroit du jeu.

Prévenir les astuces dans SpatialOS

Mouvement

Vous devez avoir une connaissance de base de la manière dont les composants constituent les entités dans SpatialOS et de la manière dont certains opérateurs peuvent donner un accès en écriture aux composants. (Vous pouvez en savoir plus sur les entités ici.)

La version la plus simple d'un lecteur est une entité qui possède un composant de transformation sur lui-même. Le client qui contrôle ce lecteur dispose d'un accès en écriture à ce composant de transformation. Tous les autres travailleurs pour lesquels cette entité est extraite recevront instantanément les modifications apportées à ce composant. Si vous créez un jeu qui ne vous inquiète pas, si les gens trichent, comme dans un jeu de chat social ou une simulation avec des spectateurs, cela pourrait être suffisant. Il est même encouragé de le faire de cette manière afin d’économiser de la bande passante et des ressources. Mais si vous avez besoin que les joueurs soient restreints de manière à éviter de tricher, c'est totalement inacceptable – un client compromis pourra se téléporter à sa guise dans n'importe quel endroit du monde.

Illustration où nous permettons à un joueur de mettre à jour sa transformation directement. Aucune vérification n'est faite pour éviter la triche.

Une technique simple pour empêcher les joueurs de se déplacer plus rapidement (ou de se téléporter!) Consiste à transférer la logique de déplacement du joueur à un ouvrier faisant autorité. Au lieu de permettre au client de mettre à jour la transformation directement sur le lecteur, nous créons simplement un nouveau composant d’entrée par lequel le lecteur peut communiquer.

Les mouvements de MOBA, comme DOTA 2 de Valve, sont calculés et effectués sur le serveur.

Voici un exemple de fichier de schéma constituant un composant PlayerInput. Le client a un accès en écriture à ce composant:

paquet de jeux;

composant PlayerInput

    id = 12001;
    float horizontal = 1;
    float vertical = 2;
    bool en cours d'exécution = 3;

Avoir la logique de déplacement effectuée sur un ouvrier dont vous avez le contrôle le rend totalement sécurisé. Pour le dire simplement, tout ce que le client envoie au travailleur faisant autorité est la direction dans laquelle le joueur s’installe et ses actions, tout comme le contrôle d’un véhicule télécommandé.

Illustration où nous autorisons uniquement le lecteur à mettre à jour des données sur un composant d’entrée. Le travailleur faisant autorité lit alors ces informations et déplace le lecteur.

Un problème majeur avec cette approche est la latence. En faisant ce qui est décrit ci-dessus avec une latence quelconque, un joueur verra son personnage bouger légèrement après qu’il lui ait dit de bouger. Dans la mesure où ils attendent que le travailleur faisant autorité déplace le joueur, ils réagiront plus tard. Nous pouvons cependant apporter de simples modifications pour le rendre acceptable.

Voici un composant PlayerInput modifié permettant la prédiction côté client:

paquet de jeux;
importat "improbable / vector3.schema";

composant PlayerInput

    id = 18001;
    improbable.Vector3f désirée_position = 1;
    bool en cours d'exécution = 2;

Au lieu d’envoyer la direction du mouvement du client au travailleur faisant autorité et d’attendre que le joueur bouge, nous déplaçons immédiatement l’objet joueur sur le client et envoyons la position à laquelle nous sommes actuellement au travailleur faisant autorité. Nous appelons cette position notre «position souhaitée». L'agent faisant autorité vérifie ensuite si nous sommes autorisés à passer de notre dernière position à la nouvelle position souhaitée et met à jour la transformation en conséquence. Deux contrôles simples peuvent être utilisés. Un pour voir si nous avançons trop vite et un autre pour voir si nous avançons dans quelque chose que nous ne sommes pas supposés faire.

Ce n'est cependant pas une solution parfaite. Vous devez encore compenser la latence afin de résoudre le paradoxe du «qui tire en premier». Je recommande de lire ces articles de blog approfondis de Gabriel Gambetta d’Improbable à propos de ce numéro.

Darkfall Unholy Wars était un MMORPG à la première personne avec un combat complet joueur contre joueur et avec une validation partielle des commandes.

Commande et demandes

Chaque fois que vous voulez faire quelque chose dans un jeu en ligne, vous envoyez une commande au serveur. Cette commande est formée comme une requête. La réponse que vous recevez du serveur est le résultat de cette demande. En d'autres termes, vous pourriez dire qu'il se comporte comme un appel de fonction simple ou un appel de procédure distante (RPC). Un exemple de requête de ce type pourrait consister à demander de construire un bloc dans Minecraft ou de lancer un sort dans Guild Wars 2.

Il y a un tas de choses qui pourraient mal tourner si des vérifications ne sont pas en place pour valider ces commandes. Comme je l'ai dit plus tôt, nous devrions toujours supposer que le contenu d'une demande est malveillant et que nous devons toujours nous assurer que les valeurs du contenu sont dans les limites autorisées.

Sans vérification adéquate en place, un pirate informatique pourrait, par exemple, lancer des sorts depuis un emplacement très éloigné de son joueur ou attaquer des ennemis très éloignés d'un lieu sûr. Ce fut le cas dans Darkfall Unholy Wars, un MMORPG que les développeurs ont laissé ouvert pour ce type de tricherie. Dans la vidéo suivante, vous pouvez voir un joueur attaquer d'autres joueurs à une grande distance, entre autres.

Il n’existe pas de solution véritable à ces problèmes, mais un conseil utile est de toujours vérifier minutieusement toutes les données envoyées avec une commande. Voici quelques exemples:

  • Vérifiez si la position envoyée avec une commande est à la portée du lecteur.
  • Chaque fois qu'un index est utilisé, assurez-vous toujours que cet index n'est pas hors limites.
  • Chaque fois qu'un index ou un type est utilisé, assurez-vous qu'ils sont autorisés à utiliser cet index ou ce type. Ne pas le faire pourrait permettre aux joueurs de créer un élément réservé aux administrateurs dans le jeu s'ils envoient des commandes «Créer cet élément».
  • Limitez le nombre de personnes autorisées à utiliser des commandes avec des délais de récupération pour éviter les inondations ou les exploits par écrasement.

Conseils de développement

Pendant que vous développez votre jeu en ligne, vous avez l'outil idéal pour vérifier la tricherie: votre propre projet. Essayez de déplacer votre lecteur dans l’éditeur en supprimant des murs, de vous téléporter et de voler dans les airs. Si vous détectez la moindre chose mais croyez que personne ne l'exploitera, vous vous trompez. Les gens vont essayer de briser les règles et les limites de votre jeu, peu importe quoi. Le mieux est d’avoir une longueur d’avance sur eux et d’essayer de casser d’abord vos propres règles.

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.