Sichern von HTTP-Daten von einem JavaScript-Spiel auf dem Server


8

Angenommen, ich mache ein JavaScript-Spiel und möchte, dass das Spiel den Server aktualisiert, wenn der Benutzer das Spiel und sein Ergebnis erfolgreich abgeschlossen hat.

Wie soll ich sicherstellen, dass die Anfrage vom JavaScript-Spiel stammt und die gesendeten Daten nicht manipuliert wurden? Ich verwende PHP als serverseitige Sprache.

Ich verstehe, dass keine Strategie zu 100% narrensicher sein wird, und alle ergriffenen Maßnahmen sind eher eine Abschreckung als ein absoluter Schutz.

Beim Bearbeiten: Nehmen wir an, wir verwenden nicht die Serverüberprüfung des Schritts jedes Benutzers (wie in einem herkömmlichen MMO). Das Spiel kann ein Minispiel als Teil eines Web- oder Lernspiels sein (z. B. Space Invaders oder ein Echtzeitspiel), und das Erfordernis einer serverseitigen Komponente für jedes dieser Spiele kann langwierig sein.

Beispiel: Angenommen, wenn das Spiel beendet ist, wird eine Anfrage über an den Server gesendet. AJAX

game_finished.php?user_id=1&outcome=success&score=88

Ein Benutzer könnte den Server "vortäuschen", indem er glaubt, dass das Spiel korrekt abgeschlossen wurde, indem er diese Anfrage an game_finished.php sendet. Wie könnte dies erschwert werden?

Antworten:


10

Zum Beispiel ein Gleitblock-Puzzle

Dies ist ein Beispiel, bei dem die serverseitige Überprüfung trivial ist. Es muss nicht jeder Schritt überprüft werden, bis das Spiel beendet ist. Senden Sie einfach die gesamte Verschiebungsliste, und der Server spielt sie erneut ab, um sicherzustellen, dass sie korrekt ist.

(Bearbeiten: Der Sinn dieser Antwort besteht nicht darin, Beispiele auszuwählen, bis Sie eines finden, das nicht trivial validierbar ist. Vielmehr sollten Sie zurückgehen und sich das Spiel ansehen, das Sie tatsächlich machen - es ist wahrscheinlich trivial validierbar. oder braucht nur eine kleine Änderung zu sein.)


Ich habe über das Beispiel nachgedacht und es ist nicht das beste Beispiel. Sagen wir dann Space Invaders. Ich werde die Frage aktualisieren.
Extrakun

2
Die Bewegung der Space Invaders ist jedoch auch völlig deterministisch. Sie müssen nur aufzeichnen, wann jedes Schuss / Treffer-Paar auftritt, die Bewegung bis zu diesem Zeitpunkt simulieren (was eine einfache lineare Gleichung ist) und sicherstellen, dass es sich tatsächlich um einen Treffer handelt.

Ich habe endlich verstanden, was du meinst, nachdem ich es mir überlegt habe. Danke
Extrakun

Nur eine Ergänzung zum "total deterministischen" Aspekt: ​​Wenn Sie in Ihrem Spiel Zufälligkeit benötigen, übergeben Sie dem Client einen bestimmten Startwert für diese Zufälligkeit und speichern Sie diesen Startwert auf dem Server. Wenn der Client das Spielprotokoll zur Bestätigung sendet, kann der Server auch die Teile wiedergeben, die zufällig sind. Gleiches gilt für Schritte, die von der Ortszeit abhängen. Ein Beispiel dafür, wie dies in JavaScript durchgeführt werden kann, finden Sie in den Algorithmen zum Speichern und Laden von Undum ( undum.com ).
BerndBrot

2

Sie können dies auf Warcraft-Weise tun: Verwenden Sie Javascript nur zum Senden von Bewegungsbefehlen an den Server und lassen Sie den Server die Logik verarbeiten.

Dies lässt Sie immer noch offen für Roboter (Javascript-Programme, die Dinge schneller und präziser als menschlich möglich bewegen), aber das ist ein großer Schritt im Vergleich dazu, die Tür für den Trick /game_finished.php offen zu lassen.


1

Wenn der Client die Punktzahl berechnet, gibt es keine Möglichkeit, sie zu validieren, außer (wie bereits erwähnt), dass der Server das Spiel erneut spielt, um zu bestätigen, dass die gleiche Punktzahl erzielt wird.

Es gibt jedoch Arten von Spielen, die Sie entwerfen können und die nicht nur auf einer numerischen Punktzahl basieren. Ein serverseitiges Skript kann beispielsweise ein mathematisches Problem mit zufälliger Addition erzeugen. Wenn der Benutzer die Antwort übermittelt, kann er seine Antwort mit der richtigen vergleichen und sie serverseitig bewerten.

Wenn Ihr Spiel jedoch komplex ist (wie im Beispiel des Space Invaders), können Sie nicht viel dagegen tun, außer a) dem Client zu vertrauen oder b) den Server das Spiel verwalten zu lassen.


-1

Es gibt viele Methoden, aber alle werden irgendwann scheitern. Sie können einen Hashwert hinzufügen oder den Abfrageschlüssel bei jeder Abfrage erneuern.

Das Wichtigste ist jedoch, dass alle Ihre Superkodierungsfunktionen als Quellcodes an den Browser des Kunden gesendet werden, und das ist DAS Problem. Um es etwas schwieriger zu machen, können Sie die Funktion "Senden per Ajax-Abfrage" verwenden, sodass Quellen nicht unter einer URL verfügbar sind. Die Funktion sollte komprimiert und möglicherweise sogar in Teilen gesendet werden, damit es schwieriger wird, alles zu kopieren. Ich würde diesen Code auch auf einer Seite wie http://jsbeautifier.org/ überprüfen, wenn Ihr Code nach dem Lesen leicht verständlich ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.