Vraag HTML5-game-beveiligingsoplossingen voor meerdere spelers


Nu er een paar nette canvas-demo's zijn van zowel klassieke platform- als zelfs 3D-fps-games in HTML5, is de volgende stap misschien het ontwikkelen van een HTML5-game voor meerdere spelers. HTML5-socketondersteuning maakt dit relatief eenvoudig, maar met bron aan de client die zichtbaar is voor iedereen in de browser, wat zijn enkele oplossingen voor elementaire gamebeveiligingsfuncties voor een HTML5-frontend multi-user game - zoals het kunnen voorkomen van een vervalste high-score indienen?


12
2018-06-05 03:13


oorsprong


antwoorden:


Het eenvoudige antwoord is: u kunt de gegevens van de klant niet vertrouwen, wat betekent dat de hoge score kan niet van de klant komen.

Omdat de codeclient beschikbaar is voor iedereen om te inspecteren, is er geen manier om de gegevens te vertrouwen die de client naar uw server verzendt. Zelfs als u de gegevens codeert met een coderingssleutel per gebruiker (wat mogelijk is), kan de gebruiker eenvoudig uw code binnen de browser wijzigen en de waarden wijzigen die deze naar de server verzendt.

Omdat je game multiplayer is, kan dit mogelijk zijn ALS de server alle scoregebeurtenissen genereert. Als de server alle scoregebeurtenissen genereert, verzendt de cliënt nooit scoregegevens naar de server, wat betekent dat de hoge scoregegevens niet kunnen worden nagebootst.

Je zult nog steeds te maken hebben met valsspelen, wat nog uitdagender is, maar dat is een ander probleem ...


16
2018-06-05 03:33



Als aanvulling op wat Larry zei, zul je zeker de score op de backend moeten afhandelen om echt valsspelen / nepscore-posting te voorkomen.

Voor een voorbeeld hiervan in de praktijk ... Het spel Word Wars is een boggle-achtig spel waarin je zoveel woorden als je kunt vinden uit een 4x4 raster van letters.

Aan het begin van elk spel wordt een 4x4-bord gegenereerd aan de serverzijde. Een lijst met mogelijke woorden voor dat bord wordt gegenereerd en een gehashte versie (md5'd met een willekeurig zout) van elk woord en het zout worden doorgegeven aan de klant.

Aan de kant van de klant, wanneer de letters worden getypt en de Enter-toets wordt ingedrukt, dan voegen we md5 (met het zout van de server) het ingevoerde woord toe en controleren dat op de lijst met gehashte woorden die door de server worden verstrekt. Als het een match is, werken we de client bij met de nieuwe score (er is een functie gebaseerd op gebruikte letters en hun puntwaarden).

Zodra het spel voorbij is, stuurt de client de lijst met woorden die ze hebben bedacht naar de server (NIET de score), en de server controleert of die woorden in het bord aanwezig waren en behandelt de score.

Hier komt Clay.io, het bedrijf waar ik in werk, binnen. Clay.io biedt een API voor high-level HTML5-gamefuncties zoals scoreborden, prestaties, betalingsverwerking, enz. Onnodig te zeggen dat we een oplossing nodig hadden voor games met een backend om bepaalde dingen zoals hoge scores veiliger te maken.

De oplossing was om JavaScript-objecten te versleutelen op de backend (node.js, php, whatever) met JWT (JSON Web Token) en dat versleutelde object door te geven in plaats van de score zelf. Hierdoor kunnen we beide manieren communiceren (game -> Clay.io en Clay.io -> game), en het is vrij pijnloos om te doen. De volledige documentatie hierover is hier: clay.io/docs/encryption (max. links hit op dit antwoord)

Terug naar Word Wars ... van de server genereren we die JWT met de score van de gebruiker en geven die door aan Clay.io om de score te boeken. Voila :)

Natuurlijk zal dit verschillen omdat het type game dat je aan het ontwikkelen bent anders is, maar de moraal van het verhaal is dat je creatief moet worden :)

Ik heb een blogpost geschreven die HTML5-game-beveiliging gedetailleerder behandelt. Deel 3 van een serie over HTML5 Game Development Tips.


4
2017-09-19 01:53