Was ist der beste Weg, um Leute davon abzuhalten, die PHP-basierte Highscore-Tabelle eines Flash-Spiels zu hacken?

Ich spreche von einem Action-Spiel, bei dem es kein oberes Scorelimit gibt und es keine Möglichkeit gibt, das Ergebnis auf dem Server zu verifizieren, indem man Moves usw. wiederholt.

Was ich wirklich brauche, ist die stärkste Verschlüsselung, die in Flash / PHP möglich ist, und eine Möglichkeit, zu verhindern, dass Leute die PHP-Seite anders als über meine Flash-Datei aufrufen. Ich habe in der Vergangenheit einige einfache Methoden ausprobiert, um mehrere Aufrufe für eine einzelne Partitur zu machen und eine Prüfsummen- / Fibonacci-Sequenz usw. zu vervollständigen und die SWF mit Amayeta SWF Encrypt zu verschleiern, aber sie wurden schließlich gehackt.

Dank StackOverflow-Antworten habe ich jetzt einige weitere Informationen von Adobe gefunden – http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html und https://github.com/mikechambers/as3corelib – was ich glaube ich kann für die Verschlüsselung verwenden. Ich bin mir nicht sicher, ob ich dadurch CheatEngine umgehe.

Ich muss die besten Lösungen für AS2 und AS3 kennen, wenn sie anders sind.

Die Hauptprobleme scheinen Dinge wie TamperData und LiveHTTP-Header zu sein, aber ich verstehe, dass es auch erweiterte Hacking-Tools gibt – wie CheatEngine (danke Mark Webster)

Solutions Collecting From Web of "Was ist der beste Weg, um Leute davon abzuhalten, die PHP-basierte Highscore-Tabelle eines Flash-Spiels zu hacken?"

Dies ist ein klassisches Problem bei Internetspielen und Wettbewerben. Ihr Flash-Code arbeitet mit Benutzern zusammen, um eine Punktzahl für ein Spiel zu bestimmen. Aber Benutzer sind nicht vertrauenswürdig, und der Flash-Code wird auf dem Computer des Benutzers ausgeführt. Du bist SOL. Es gibt nichts, was Sie tun können, um zu verhindern, dass ein Angreifer hohe Punkte erzielt:

  • Flash ist sogar noch einfacher zu rekonstruieren, als Sie vielleicht denken, da die Bytecodes gut dokumentiert sind und eine höhere Sprache beschreiben (Actionscript) — wenn Sie ein Flash-Spiel veröffentlichen, veröffentlichen Sie Ihren Quellcode, egal ob Sie weiß es oder nicht.

  • Angreifer steuern den Laufzeitspeicher des Flash-Interpreters, so dass jeder, der weiß, wie man einen programmierbaren Debugger benutzt, jede Variable (einschließlich der aktuellen Punktzahl) jederzeit ändern oder das Programm selbst ändern kann.

Der einfachste mögliche Angriff auf Ihr System besteht darin, den HTTP-Verkehr für das Spiel über einen Proxy laufen zu lassen, den High-Score-Speicher zu speichern und ihn mit einer höheren Punktzahl wiederzugeben.

Sie können versuchen, diesen Angriff zu blockieren, indem Sie jeden Highscore-Speicher an eine einzelne Instanz des Spiels binden, indem Sie beispielsweise beim Start des Spiels ein verschlüsseltes Token an den Client senden, das folgendermaßen aussehen könnte:

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number)) 

(Sie können auch einen Session-Cookie mit demselben Effekt verwenden).

Der Spielecode gibt dieses Token an den Server mit dem Highscore-Speicher zurück. Ein Angreifer kann das Spiel jedoch noch einmal starten, einen Token erhalten und diesen Token dann sofort in einen erneut gespielten Highscore-Speicher einfügen.

Als nächstes füttern Sie nicht nur einen Token oder einen Session-Cookie, sondern auch einen High-Score-verschlüsselnden Sitzungsschlüssel. Dies wird ein 128-Bit-AES-Schlüssel sein, der selbst mit einem Schlüssel verschlüsselt in das Flash-Spiel verschlüsselt ist:

 hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key)) 

Jetzt, bevor das Spiel den Highscore veröffentlicht, entschlüsselt es den High-Score-Verschlüsselungssitzungsschlüssel, was er tun kann, weil Sie den High-Score-Verschlüsselungssitzungsschlüssel-Entschlüsselungsschlüssel fest in die Flash-Binärdatei geschrieben haben. Sie verschlüsseln den Highscore mit diesem entschlüsselten Schlüssel zusammen mit dem SHA1-Hash des Highscore:

 hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score))) 

Der PHP-Code auf dem Server prüft das Token, um sicherzustellen, dass die Anfrage von einer gültigen Spielinstanz stammt, entschlüsselt dann den verschlüsselten Highscore und überprüft, ob der Highscore mit dem SHA1 des Highscore übereinstimmt (wenn Sie diesen Schritt überspringen) Entschlüsselung wird einfach zufällige, wahrscheinlich sehr hohe, hohe Punktzahlen erzeugen).

Jetzt dekompiliert der Angreifer Ihren Flash-Code und findet schnell den AES-Code, der wie ein wilder Daumen herausragt, obwohl er selbst in 15 Minuten mit einer Speichersuche und einem Tracer (“Ich weiß Meine Punktzahl für dieses Spiel ist 666, also lasst uns 666 im Speicher finden, dann fangt jede Operation, die diesen Wert berührt — ach schau, der Highscore-Verschlüsselungscode! “). Mit dem Sitzungsschlüssel muss der Angreifer nicht einmal den Flash-Code ausführen; Sie schnappt sich einen Spielstart-Token und einen Sitzungsschlüssel und kann einen beliebigen Highscore zurücksenden.

Sie sind jetzt an dem Punkt, an dem die meisten Entwickler einfach aufgeben – geben oder nehmen Sie ein paar Monate damit zu, sich mit Angreifern anzustellen, indem Sie:

  • Verwechseln der AES-Schlüssel mit XOR-Operationen

  • Ersetzen von Key-Byte-Arrays durch functionen, die den Schlüssel berechnen

  • Streuen von gefälschten Schlüsselverschlüsselungen und High-Score-Postings in der gesamten Binärdatei.

Das alles ist meistens Zeitverschwendung. Es versteht sich von selbst, dass SSL Ihnen auch nicht helfen wird; SSL kann Sie nicht schützen, wenn einer der beiden SSL-Endpunkte bösartig ist.

Hier sind einige Dinge, die High-Score-Betrug tatsächlich reduzieren können:

  • Erfordern Sie eine Anmeldung, um das Spiel zu spielen, lassen Sie das Login ein Session-Cookie erstellen und erlauben Sie nicht mehrere ausstehende Spiele in derselben Sitzung oder mehrere gleichzeitige Sitzungen für denselben Benutzer.

  • Lenke hohe Punktzahlen von Spielsitzungen ab, die weniger dauern als die kürzesten echten Spiele, die jemals gespielt wurden (für einen ausgeklügelteren Ansatz versuche, hohe Punktzahlen für Spielsitzungen mit weniger als 2 Standardabweichungen unter der mittleren Spieldauer zu “unter Quarantäne” zu bringen). Stellen Sie sicher, dass Sie die Spieldauer serverseitig verfolgen.

  • Ablehnen oder hohe Quarantäne von Logins, die das Spiel nur ein- oder zweimal gespielt haben, so dass Angreifer für jedes von ihnen erstellte Login eine “Papierspur” mit vernünftigem Spielverlauf erstellen müssen.

  • “Heartbeat” punktet während des Spiels, so dass Ihr Server das Punktewachstum während der Lebensdauer eines Spiels sieht. Lehnen Sie hohe Punktzahlen ab, die nicht den angemessenen Punktzahlen entsprechen (z. B. Springen von 0 auf 999999).

  • “Schnappschuss” -Spielzustand während des Spiels (z. B. Munitionsmenge, Position im Level usw.), die Sie später mit den aufgezeichneten Zwischenwerten abstimmen können. Sie müssen nicht einmal eine Möglichkeit haben, Anomalien in diesen Daten zu erkennen; Sie müssen es nur sammeln, und dann können Sie zurückgehen und es analysieren, wenn die Dinge fischig aussehen.

  • Deaktivieren Sie das Konto eines Benutzers, der eine Ihrer Sicherheitsprüfungen nicht bestanden hat (z. B. indem Sie einen verschlüsselten Highscore senden, dessen validation fehlschlägt).

Denken Sie daran, dass Sie hier nur High-Score-Betrug abschrecken. Sie können nichts dagegen tun, wenn. Wenn in Ihrem Spiel Geld auf dem Spiel steht, wird jemand jedes System besiegen, mit dem Sie kommen. Das Ziel ist nicht, diesen Angriff zu stoppen ; es ist, den Angriff teurer zu machen, als nur wirklich gut im Spiel zu sein und es zu schlagen.

Sie können die falsche Frage stellen. Sie scheinen sich auf die Methoden konzentriert zu haben, die die Leute verwenden, um sich auf der Highscore-Liste durchzusetzen, aber das Blockieren bestimmter Methoden geht nur so weit. Ich habe keine Erfahrung mit TamperData, daher kann ich damit nicht sprechen.

Die Frage, die Sie stellen sollten, lautet: “Wie kann ich überprüfen, ob die eingereichten Ergebnisse gültig und authentisch sind?” Die spezielle Art, dies zu tun, ist spielabhängig. Bei sehr einfachen Puzzlespielen können Sie die Punktzahl zusammen mit dem spezifischen Startzustand und der Abfolge der Züge, die zum Endzustand geführt haben, senden und dann das Spiel auf der Serverseite mit denselben Bewegungen erneut ausführen. Bestätigen Sie, dass das angegebene Ergebnis mit dem berechneten Ergebnis übereinstimmt und akzeptieren Sie das Ergebnis nur, wenn sie übereinstimmen.

Ein einfacher Weg, dies zu tun, wäre, einen kryptografischen Hash Ihres Highscore-Wertes zusammen mit dem Ergebnis selbst zu liefern. Zum Beispiel, wenn Sie die Ergebnisse über HTTP GET: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

Bei der Berechnung dieser Prüfsumme sollte ein gemeinsames Geheimnis verwendet werden; Dieses Geheimnis sollte niemals über das Netzwerk übertragen werden, sollte aber sowohl im PHP-Backend als auch im Flash-Frontend fest codiert sein. Die obige Prüfsumme wurde erstellt, indem die Zeichenfolge ” secret ” der Partitur ” 500 ” vorangestellt und durch md5sum ausgeführt wurde.

Obwohl dieses System verhindert, dass ein Benutzer willkürliche Bewertungen veröffentlicht, verhindert es nicht einen “Wiederholungsangriff”, bei dem ein Benutzer eine zuvor berechnete Bewertung und Hash-Kombination erneut absetzt. Im obigen Beispiel würde eine Punktzahl von 500 immer die gleiche Hash-Zeichenfolge erzeugen. Ein Teil dieses Risikos kann gemindert werden, indem mehr Informationen (z. B. Benutzername, Zeitstempel oder IP-Adresse) in die Zeichenfolge aufgenommen werden, die gehashed werden soll. Dies verhindert zwar nicht die Wiedergabe von Daten, stellt jedoch sicher, dass ein Datensatz nur für einen einzelnen Benutzer gleichzeitig gültig ist.

Um zu verhindern, dass Replay-Angriffe auftreten, muss eine Art von Challenge-Response-System erstellt werden, z.

  1. Das Flash-Spiel (“der Client”) führt ein HTTP GET von http://example.com/highscores.php ohne Parameter durch. Diese Seite gibt zwei Werte zurück: einen zufällig generierten Salt- Wert und einen kryptografischen Hash dieses Salt-Werts in Kombination mit dem gemeinsamen geheimen Schlüssel. Dieser Salt-Wert sollte in einer lokalen database ausstehender Abfragen gespeichert werden, und ihm sollte ein Zeitstempel zugeordnet sein, damit er nach etwa einer Minute “ablaufen” kann.
  2. Das Flash-Spiel kombiniert den Salt-Wert mit dem Shared-Secret und berechnet einen Hash, um zu überprüfen, ob dieser mit dem vom Server bereitgestellten übereinstimmt. Dieser Schritt ist erforderlich, um zu verhindern, dass Benutzer die Salt-Werte manipulieren, da sie überprüft, ob der Salt-Wert tatsächlich vom Server generiert wurde.
  3. Das Flash-Spiel kombiniert den Salt-Wert mit dem Shared Secret, Highscore-Wert und anderen relevanten Informationen (Nickname, IP, Timestamp) und berechnet einen Hash. Anschließend sendet es diese Informationen zusammen mit dem Salt-Wert, Highscore und anderen Informationen über HTTP GET oder POST zurück an das PHP-Backend.
  4. Der Server kombiniert die empfangenen Informationen auf die gleiche Weise wie auf dem Client und berechnet einen Hash, um zu überprüfen, ob dieser mit dem vom Client bereitgestellten übereinstimmt. Es überprüft dann auch, dass der Salt-Wert weiterhin gültig ist, wie in der Liste der ausstehenden Abfragen aufgeführt. Wenn diese beiden Bedingungen erfüllt sind, schreibt es den Highscore in die Highscore-Tabelle und gibt eine signierte “Erfolgsmeldung” an den Client zurück. Es entfernt außerdem den Salt-Wert aus der Liste der ausstehenden Abfragen.

Bitte beachten Sie, dass die Sicherheit einer der oben genannten Techniken gefährdet ist, wenn das gemeinsame Geheimnis für den Benutzer zugänglich ist

Als Alternative könnten einige dieser Vor- und Zurückschritte vermieden werden, indem der Client gezwungen wird, über HTTPS mit dem Server zu kommunizieren, und sichergestellt wird, dass der Client so konfiguriert ist, dass er nur Zertifikaten vertraut, die von einer bestimmten Zertifizierungsstelle signiert wurden .

Ich mag was tpqf gesagt hat, aber anstatt einen Account zu deaktivieren, wenn Cheaten entdeckt wird, implementiere einen Honigtopf, so dass sie bei jedem Login ihre gehackten Punkte sehen und niemals vermuten, dass sie als Troll markiert wurden. Google für “phpBB MOD Troll” und du wirst einen genialen Ansatz sehen.

In der angenommenen Antwort erwähnt tqbf, dass Sie einfach eine Speichersuche für die Score-Variable durchführen können (“Mein Score ist 666, also suche ich nach der Nummer 666 im Speicher”).

Es gibt einen Weg dahin. Ich habe eine class hier: http://divilysausages.com/blog/safenumber_and_safeint

Grundsätzlich haben Sie ein Objekt, um Ihre Punkte zu speichern. Im Setter multipliziert er den übergebenen Wert mit einer Zufallszahl (+ und -), und im Getter teilt man den gespeicherten Wert durch den Zufallsmultiplikator auf, um das Original zurückzuerhalten. Es ist einfach, hilft aber bei der Speichersuche.

Schau dir auch das Video von einigen der Jungs hinter der PushButton-Engine an, die über verschiedene Möglichkeiten sprechen, wie du Hacking bekämpfen kannst: http://zaa.tv/2010/12/the-art-of-hacking-flash- Spiele / . Sie waren die Inspiration hinter der class.

Die Verschlüsselung mit einem bekannten (privaten) reversiblen Schlüssel wäre die einfachste Methode. Ich bin nicht alle auf AS, also bin ich nicht sicher, welche Arten von Verschlüsselungsanbietern es gibt.

Aber Sie könnten Variablen wie Spiellänge (verschlüsselt, wieder) und einen Klick zählen.

Alle diese Dinge können reverse engineered sein, also erwägen Sie, eine Menge Junk-Daten einzucasting, um Leute vom Geruch zu vertreiben.

Edit: Es könnte sich auch lohnen, in einigen PHP-Sessions zu chippen. Starten Sie die Sitzung, wenn Sie auf Spiel starten klicken und (wie der Kommentar zu diesem Post sagt) die Uhrzeit protokollieren. Wenn sie den Punktestand einreichen, können Sie überprüfen, ob sie tatsächlich ein offenes Spiel haben, und sie geben keine Punkte zu früh oder zu groß ein.

Es könnte sich lohnen, einen Skalar auszuarbeiten, um zu sehen, wie hoch die maximale Punktzahl pro Sekunde / Minute ist.

Keines dieser Dinge ist unumgehbar, aber es wird helfen, eine Logik zu haben, die nicht im Flash ist, wo die Leute es sehen können.

Nach meiner Erfahrung wird dies am besten als ein soziales Entwicklungsproblem und nicht als ein Programmierproblem betrachtet. Anstatt sich darauf zu konzentrieren, es unmöglich zu machen zu betrügen, konzentrieren Sie sich darauf, es langweilig zu machen, indem Sie die Anreize zum Schummeln entfernen. Zum Beispiel, wenn der Hauptanreiz öffentlich sichtbare hohe Punktzahlen ist, kann es einfach sein, eine Verzögerung zu setzen, wenn hohe Punktzahlen angezeigt werden, indem die positive Rückkopplungsschleife für Betrüger entfernt wird.

Sie können den vom Client zurückgegebenen Daten nicht vertrauen. Die validation muss auf der Serverseite durchgeführt werden. Ich bin kein Spieleentwickler, aber ich mache Geschäftssoftware. In beiden Fällen kann Geld beteiligt sein, und die Leute werden die Verschleierungstechniken auf der Client-Seite durchbrechen.

Vielleicht senden Sie Daten regelmäßig an den Server zurück und führen eine Überprüfung durch. Konzentrieren Sie sich nicht auf den Client-Code, selbst wenn Ihre Anwendung dort lebt.

Ich habe eine Art Workaround gemacht … Ich hatte ein Give, bei dem die Punktzahlen erhöht wurden (du erhältst immer +1 Punkte). Zuerst habe ich angefangen, von zufälligen Zahlen zu zählen (sagen wir 14), und wenn ich die Punkte zeige, zeigte nur die Punkte var minus 14. Das war so, wenn die Cracker zum Beispiel nach 20 suchen, werden sie es nicht finden (es wird 34 in der Erinnerung sein). Zweitens, da ich weiß, was der nächste Punkt sein sollte … Ich benutzte Adobe-Crypto-Bibliothek, um den Hash von dem zu erstellen, was der nächste Punkt sein sollte . Wenn ich die Scores inkrementieren muss, überprüfe ich, ob der Hash der inkrementierten Scores gleich dem Hash is sein soll. Wenn der Cracker die Punkte im Speicher geändert hat, sind die Hashes nicht gleich. Ich führe einige serverseitige Verifizierungen durch und als ich verschiedene Punkte vom Spiel und vom PHP bekam, weiß ich, dass Betrug eine Rolle spielte. Hier ist ein Code-Schnipsel (Ich benutze Adobe Crypto libraty MD5-class und zufällige Kryptographie Salz. CallPhp () ist meine serverseitige validation)

 private function addPoint(event:Event = null):void{ trace("expectedHash: " + expectedHash + " || new hash: " + MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt) ); if(expectedHash == MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt)){ SCORES +=POINT; callPhp(); expectedHash = MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt); } else { //trace("cheat engine usage"); } } 

Mit dieser Technik + SWF-Obfustion konnte ich die Cracker stoppen. Wenn ich die Ergebnisse an die Serverseite sende, benutze ich meine eigene kleine Verschlüsselungs- / Entschlüsselungsfunktion. So etwas (serverseitiger Code nicht enthalten, aber Sie können den Algorithmus sehen und in PHP schreiben):

 package { import bassta.utils.Hash; public class ScoresEncoder { private static var ranChars:Array; private static var charsTable:Hash; public function ScoresEncoder() { } public static function init():void{ ranChars = String("qwertyuiopasdfghjklzxcvbnm").split("") charsTable = new Hash({ "0": "x", "1": "f", "2": "q", "3": "z", "4": "a", "5": "o", "6": "n", "7": "p", "8": "w", "9": "y" }); } public static function encodeScore(_s:Number):String{ var _fin:String = ""; var scores:String = addLeadingZeros(_s); for(var i:uint = 0; i< scores.length; i++){ //trace( scores.charAt(i) + " - > " + charsTable[ scores.charAt(i) ] ); _fin += charsTable[ scores.charAt(i) ]; } return _fin; } public static function decodeScore(_s:String):String{ var _fin:String = ""; var decoded:String = _s; for(var i:uint = 0; i< decoded.length; i++){ //trace( decoded.charAt(i) + " - > " + charsTable.getKey( decoded.charAt(i) ) ); _fin += charsTable.getKey( decoded.charAt(i) ); } return _fin; } public static function encodeScoreRand(_s:Number):String{ var _fin:String = ""; _fin += generateRandomChars(10) + encodeScore(_s) + generateRandomChars(3) return _fin; } public static function decodeScoreRand(_s:String):Number{ var decodedString:String = _s; var decoded:Number; decodedString = decodedString.substring(10,13); decodedString = decodeScore(decodedString); decoded = Number(decodedString); return decoded; } public static function generateRandomChars(_length:Number):String{ var newRandChars:String = ""; for(var i:uint = 0; i< _length; i++){ newRandChars+= ranChars[ Math.ceil( Math.random()*ranChars.length-1 )]; } return newRandChars; } private static function addLeadingZeros(_s:Number):String{ var _fin:String; if(_s < 10 ){ _fin = "00" + _s.toString(); } if(_s >= 10 && _s < 99 ) { _fin = "0" + _s.toString(); } if(_s >= 100 ) { _fin = _s.toString(); } return _fin; } }//end } 

Dann sende ich die Variable mit anderen Fake-Vars zusammen und es ist einfach verloren gegangen … Es ist eine Menge Arbeit für nur kleine Flash-Spiele, aber wo Preise involviert sind, werden manche Leute nur gierig. Wenn Sie Hilfe brauchen, schreiben Sie mir eine PM.

Prost, Ico

Wann immer Ihr Highscore-System auf der Tatsache basiert, dass die Flash-Anwendung ungeschminkte / unsignierte Highscore-Daten über das Netzwerk sendet, kann diese abgefangen und manipuliert / wiedergegeben werden. Die Antwort ergibt sich daraus: Verschlüsseln (anständig!) Oder kryptographisch Highscore-Daten signieren. Dies macht es zumindest für Leute schwieriger, Ihr Highscore-System zu knacken, da sie den geheimen Schlüssel aus Ihrer SWF-Datei extrahieren müssen. Viele Leute werden wahrscheinlich genau dort aufgeben. Auf der anderen Seite braucht es nur eine Person, um den Schlüssel zu extrahieren und irgendwo zu veröffentlichen.

Echte Lösungen beinhalten mehr Kommunikation zwischen der Flash-Anwendung und der Highscore-database, so dass diese überprüfen kann, ob ein bestimmter Punktestand realistisch ist. Dies ist wahrscheinlich kompliziert, je nachdem, welche Art von Spiel Sie haben.

Es gibt keine Möglichkeit, es vollständig zu entschlüsseln, da es einfach ist, SWFs zu dekompilieren, und ein geschickter Entwickler-Hacker könnte dann Ihren Code verfolgen und herausfinden, wie Sie ein verschlüsseltes System umgehen können.

Wenn Sie Kinder einfach mit einfachen Tools wie TamperData betrügen möchten, können Sie einen Verschlüsselungsschlüssel generieren, den Sie beim Start an die SWF-Datei übergeben. Verwenden Sie dann etwas wie http://code.google.com/p/as3crypto/ , um den Highscore zu verschlüsseln, bevor Sie ihn an den PHP-Code zurückgeben. Entschlüsseln Sie es dann am Serverende, bevor Sie es in der database speichern.

Sie sprechen über das sogenannte “Client Trust” -Problem. Weil der Kunde (in diesem Geld, einer SWF, die in einem Browser läuft) etwas tut, was er tun soll. Speichere eine hohe Punktzahl.

Das Problem besteht darin, dass Sie sicherstellen möchten, dass die Anforderungen für “Score speichern” von Ihrem Flash-Film kommen und nicht von einer beliebigen HTTP-Anfrage. Eine mögliche Lösung hierfür ist die Codierung eines vom Server generierten Tokens zum Zeitpunkt der Anforderung in die SWF (unter Verwendung von flasm ), die der Anforderung zur Speicherung einer hohen Punktzahl folgen muss. Sobald der Server dieses Ergebnis speichert, ist das Token abgelaufen und kann nicht mehr für Anforderungen verwendet werden.

Der Nachteil dabei ist, dass ein Nutzer nur einen Highscore pro Ladung des Flash-Films einreichen kann – Sie müssen ihn zwingen, die SWF zu aktualisieren, bevor sie erneut für eine neue Punktzahl spielen können.

Normalerweise füge ich “Ghost-Daten” der Spielsitzung mit dem Highscore-Eintrag hinzu. Wenn ich also ein Rennspiel mache, füge ich die Wiedergabedaten hinzu. Sie haben oft die Replay-Daten bereits für Replay-functionalität oder Ghost Racing-functionalität (gegen Ihr letztes Rennen spielen oder gegen den Geist von Typ 14 in der Rangliste spielen).

Dies zu überprüfen ist sehr mühsam, aber wenn das Ziel darin besteht, zu überprüfen, ob die Top-10-Einträge in einem Wettbewerb legitim sind, kann dies eine nützliche Ergänzung zu dem Arsenal von Sicherheitsmaßnahmen sein, auf die andere bereits hingewiesen haben.

Wenn es das Ziel ist, Highscore-Listen bis zum Ende der Zeit online zu halten, ohne dass jemand sie ansehen muss, bringt das nicht viel.

Die Art und Weise, wie eine neue Arcade-Mod funktioniert, ist, dass sie Daten vom Flash zu PHP, zurück zum Flash (oder neu geladen) und dann zurück zu PHP sendet. Dies ermöglicht Ihnen, alles zu tun, was Sie wollen, um die Daten zu vergleichen und Post-Daten / Entschlüsselungs-Hacks und ähnliches zu umgehen. Eine Möglichkeit, dies zu tun, besteht darin, 2 zufällige Werte von php dem Flash zuzuordnen (das Sie nicht erfassen oder sehen können, selbst wenn Sie einen Echtzeit-Flash-Grabber ausführen), indem Sie eine mathematische Formel verwenden, um die Punktzahl mit den Zufallswerten zu vergleichen die gleiche Formel, um es umzukehren, um zu sehen, ob die Punktzahl übereinstimmt, wenn es am Ende schließlich zum PHP geht. Diese zufälligen Werte sind nie sichtbar, ebenso wie die Anzahl der Transaktionen und wenn sie länger als ein paar Sekunden ist, wird sie auch als Cheating markiert, da angenommen wird, dass Sie den Sendevorgang gestoppt haben, um die Zufallswerte zu ermitteln die Zahlen durch irgendeine Art von Chiffre, um mögliche zufällige Werte zurückzugeben, um mit dem Bewertungswert zu vergleichen.

Dies scheint eine ziemlich gute Lösung zu sein, wenn Sie mich fragen, sieht jemand irgendwelche Probleme mit der Verwendung dieser Methode? Oder mögliche Wege drum herum?

Ich denke, der einfachste Weg wäre, Aufrufe an eine function wie RegisterScore (Score) jedes Mal zu machen, wenn das Spiel eine hinzuzufügende Punktzahl registriert und sie dann codiert, verpackt und als String an ein PHP-Skript sendet. Das PHP-Skript würde wissen, wie man es richtig dekodiert. Dies würde alle Aufrufe direkt an das PHP-Skript stoppen, da alle Versuche, eine Bewertung zu erzwingen, zu einem Dekompressionserrors führen würden.

Dies ist nur möglich, wenn die gesamte Spiellogik auf der Serverseite gehalten wird, die das Ergebnis auch intern ohne Kenntnis des Benutzers speichert. Aus wirtschaftlichen und wissenschaftlichen Gründen kann die Menschheit diese Theorie nicht auf alle Spielarten anwenden, außer rundenbasierend. Zum Beispiel, um die Physik auf der Serverseite zu halten, ist rechenintensiv und es ist schwierig, so schnell wie möglich zu reagieren. Sogar möglich, wenn jemand Schach spielt, kann er das KI-Schachspiel mit dem Gegner vergleichen. Daher sollten bessere Multiplayer-Spiele auch On-Demand-Kreativität enthalten.

Es ist nicht wirklich möglich zu erreichen, was Sie wollen. Die Interna der Flash-App sind immer teilweise zugänglich, besonders wenn Sie wissen, wie man Dinge wie CheatEngine verwendet , egal wie sicher Ihre Website und Browser < -> Server-Kommunikation sind, es wird immer noch relativ einfach zu bewältigen sein.

Es könnte eine gute Idee sein, über AMFPHP mit dem Backend zu kommunizieren . Es sollte zumindest die Faulenken davon abhalten, die Ergebnisse über die Browser-Konsole zu pushen.