it-swarm-eu.dev

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

Ich spreche von einem Actionspiel ohne obere Punktzahlgrenze und ohne Möglichkeit, die Punktzahl auf dem Server durch Wiederholung von Zügen usw. zu überprüfen.

Was ich wirklich brauche, ist die stärkste Verschlüsselung, die in Flash/PHP möglich ist, und eine Möglichkeit, zu verhindern, dass andere Benutzer die Seite PHP über meine Flash-Datei aufrufen. Ich habe in der Vergangenheit einige einfache Methoden ausprobiert mehrfache Aufrufe für eine einzige Partitur und Abschluss einer Prüfsummen-/Fibonacci-Sequenz usw. sowie Verschleierung der SWF-Datei mit Amayeta SWF Encrypt, aber letztendlich wurden sie alle gehackt.

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

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

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

212
Iain

Dies ist ein klassisches Problem bei Internetspielen und -wettbewerben. Ihr Flash-Code entscheidet gemeinsam mit den Benutzern über eine Punktzahl für ein Spiel. Den Benutzern wird jedoch nicht vertraut, und der Flash-Code wird auf dem Computer des Benutzers ausgeführt. Du bist SOL. Sie können nichts tun, um einen Angreifer daran zu hindern, Highscores zu fälschen:

  • Flash ist noch einfacher rückzuentwickeln, als Sie vielleicht denken, da die Bytecodes gut dokumentiert sind und eine Hochsprache (Actionscript) beschreiben. Wenn Sie ein Flash-Spiel veröffentlichen, veröffentlichen Sie Ihren Quellcode, ganz gleich, ob Sie es veröffentlichen weiß es oder nicht.

  • Angreifer steuern den Laufzeitspeicher des Flash-Interpreters, sodass jeder, der mit einem programmierbaren Debugger vertraut ist, jederzeit eine beliebige Variable (einschließlich der aktuellen Punktzahl) oder das Programm selbst ändern kann.

Der einfachste mögliche Angriff auf Ihr System besteht darin, den HTTP-Datenverkehr für das Spiel über einen Proxy auszuführen, den Highscore-Speicher abzufangen und ihn mit einem höheren Score abzuspielen.

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. Dies könnte folgendermaßen aussehen:

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

(Sie können auch ein Sitzungscookie verwenden, um den gleichen Effekt zu erzielen.).

Der Spielcode sendet dieses Token mit der Highscore-Speicherung an den Server zurück. Ein Angreifer kann das Spiel dennoch einfach erneut starten, einen Token erhalten und diesen Token sofort in einen erneut gespielten Highscore-Speicher einfügen.

Als Nächstes geben Sie nicht nur ein Token oder einen Sitzungscookie ein, sondern auch einen Sitzungsschlüssel mit hoher Punktzahl. Dies ist ein 128-Bit-AES-Schlüssel, der selbst mit einem im Flash-Spiel fest codierten Schlüssel verschlüsselt ist:

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

Bevor das Spiel den Highscore veröffentlicht, entschlüsselt es den Highscore-Verschlüsselungs-Sitzungsschlüssel. Dies ist möglich, da Sie den Highscore-Verschlüsselungs-Sitzungsschlüssel-Entschlüsselungsschlüssel in der Flash-Binärdatei fest codiert haben. Sie verschlüsseln den Highscore mit diesem entschlüsselten Schlüssel zusammen mit dem SHA1-Hash des Highscores:

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

Der PHP - Code auf dem Server überprüft das Token, um sicherzustellen, dass die Anforderung von einer gültigen Spielinstanz stammt, entschlüsselt dann den verschlüsselten Highscore und überprüft, ob der Highscore mit dem SHA1 des übereinstimmt Highscore (Wenn Sie diesen Schritt überspringen, führt die Entschlüsselung einfach zu zufälligen, wahrscheinlich sehr hohen Highscores).

Jetzt dekompiliert der Angreifer Ihren Flash - Code und findet schnell den AES - Code, der wie ein schmerzender Daumen herausragt, auch wenn er nicht in 15 Minuten mit einer Speichersuche und einem Tracer aufgespürt werden würde ("Ich weiß meine Punktzahl für dieses Spiel ist 666, also lasst uns 666 im Speicher finden und dann jede Operation abfangen, die diesen Wert berührt --- oh, sieh mal, der Highscore-Verschlüsselungscode! "). Mit dem Sitzungsschlüssel muss der Angreifer nicht einmal den Flash-Code ausführen. Sie holt sich einen Spielstart-Token und einen Sitzungsschlüssel und kann einen beliebigen Highscore zurückschicken.

Sie sind jetzt an dem Punkt angelangt, an dem die meisten Entwickler einfach aufgeben - ein paar Monate lang mit Angreifern herumspielen, indem Sie:

  • Verwürfeln der AES - Schlüssel mit XOR - Operationen

  • Ersetzen von Schlüsselbyte-Arrays durch Funktionen, die den Schlüssel berechnen

  • Verteile gefälschte Schlüsselverschlüsselungen und Highscore-Postings in der gesamten Binärdatei.

Das ist alles meistens Zeitverschwendung. Selbstverständlich hilft Ihnen auch SSL nicht weiter. SSL kann Sie nicht schützen, wenn einer der beiden SSL-Endpunkte fehlerhaft ist.

Hier sind einige Dinge, die den Highscore-Betrug reduzieren können:

  • Zum Spielen ist eine Anmeldung erforderlich, die Anmeldung muss ein Sitzungscookie erstellen, und es dürfen nicht mehrere ausstehende Spielstarts in derselben Sitzung oder mehrere gleichzeitige Sitzungen für denselben Benutzer ausgeführt werden.

  • Lehnen Sie Highscores von Spielsitzungen ab, die kürzer sind als die kürzesten jemals gespielten echten Spiele (für einen differenzierteren Ansatz versuchen Sie, Highscores für Spielsitzungen, die weniger als 2 Standardabweichungen unter der durchschnittlichen Spieldauer dauern, in die Quarantäne zu stellen). Stellen Sie sicher, dass Sie die Spieldauer serverseitig verfolgen.

  • Verwerfen oder isolieren Sie Highscores von Anmeldungen, die das Spiel nur ein- oder zweimal gespielt haben, so dass Angreifer für jede von ihnen erstellte Anmeldung einen "Papierpfad" mit einem angemessenen Erscheinungsbild erstellen müssen.

  • "Heartbeat" wird während des Spiels gewertet, sodass Ihr Server über die gesamte Lebensdauer eines Spiels einen Anstieg der Punktzahl feststellt. Lehnen Sie Highscores ab, die nicht angemessenen Score-Kurven folgen (z. B. von 0 auf 999999 springen).

  • "Schnappschuss" -Spielstatus während des Spiels (z. B. Munitionsmenge, Position im Level usw.), den Sie später mit den aufgezeichneten Zwischenergebnissen abgleichen können. Zunächst müssen Sie nicht einmal die Möglichkeit haben, Anomalien in diesen Daten zu erkennen. Sie müssen es nur einsammeln, und dann können Sie zurückgehen und es analysieren, wenn es faul aussieht.

  • Deaktivieren Sie das Konto eines Benutzers, der eine Ihrer Sicherheitsüberprüfungen nicht besteht (z. B. indem Sie jemals einen verschlüsselten Highscore übermitteln, der die Validierung nicht besteht).

Denken Sie jedoch daran, dass Sie hier nur Highscore-Betrug verhindern. Es gibt nichts was Sie tun können, um zu verhindern, wenn. Wenn in Ihrem Spiel Geld auf dem Spiel steht, wird jemand jedes System besiegen, das Sie sich ausgedacht haben. Das Ziel ist nicht Stopp dieser Angriff; Es ist, den Angriff teurer zu machen, als nur richtig gut im Spiel zu werden und es zu schlagen.

414
tqbf

Möglicherweise stellen Sie die falsche Frage. Sie scheinen sich auf die Methoden zu konzentrieren, mit denen sich die Spieler den Weg in die Highscore-Liste bahnen, aber das Blockieren bestimmter Methoden geht nur so weit. Ich habe keine Erfahrung mit TamperData, daher kann ich nicht damit sprechen.

Die Frage, die Sie stellen sollten, lautet: "Wie kann ich überprüfen, ob die eingereichten Ergebnisse gültig und authentisch sind?" Die genaue Vorgehensweise hängt vom jeweiligen Spiel ab. Bei sehr einfachen Puzzlespielen können Sie die Punktzahl zusammen mit dem jeweiligen Startzustand und der Reihenfolge der Züge, die zum Endzustand geführt haben, übermitteln und das Spiel auf der Serverseite mit denselben Zügen erneut ausführen. Bestätigen Sie, dass die angegebene Punktzahl mit der berechneten Punktzahl übereinstimmt, und akzeptieren Sie die Punktzahl nur, wenn sie übereinstimmt.

25
Stephen Deken

Eine einfache Möglichkeit, dies zu tun, besteht darin, einen kryptografischen Hash Ihres Highscore-Werts zusammen mit der Bewertung selbst bereitzustellen. Beispiel für das Posten der 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, sondern sollte sowohl im PHP Backend als auch im Flash Frontend fest codiert sein. Die obige Prüfsumme wurde durch Voranstellen des Strings " geheime "zur Partitur" 500 "und lasse es durch md5sum laufen.

Obwohl dieses System einen Benutzer daran hindert, willkürliche Ergebnisse zu veröffentlichen, verhindert es keinen "Wiederholungsangriff", bei dem ein Benutzer eine zuvor berechnete Kombination aus Ergebnis und Hash erneut veröffentlicht. Im obigen Beispiel würde eine Punktzahl von 500 immer dieselbe Hash-Zeichenfolge erzeugen. Ein Teil dieses Risikos kann durch Einfügen weiterer Informationen (z. B. eines Benutzernamens, eines Zeitstempels oder einer IP-Adresse) in die zu hashende Zeichenfolge verringert werden. Dies verhindert zwar nicht die Wiedergabe von Daten, stellt jedoch sicher, dass ein Datensatz nur für einen einzelnen Benutzer zu einem bestimmten Zeitpunkt gültig ist.

Um das Auftreten von Wiederholungsangriffen zu verhindern, muss eine Art Challenge-Response-System erstellt werden, z.

  1. Das Flash-Spiel ("der Client") führt ein HTTP-GET von http://example.com/highscores.php durch. ohne Parameter. Diese Seite gibt zwei Werte zurück: einen zufällig generierten Wert salt und einen kryptografischen Hash dieses Salt-Werts in Kombination mit dem gemeinsamen Geheimnis. Dieser Salt-Wert sollte in einer lokalen Datenbank ausstehender Abfragen gespeichert und mit einem Zeitstempel versehen sein, damit er nach möglicherweise einer Minute "abläuft".
  2. Das Flash-Spiel kombiniert den Salt-Wert mit dem gemeinsamen Geheimnis und berechnet einen Hash, um sicherzustellen, dass dieser mit dem vom Server bereitgestellten übereinstimmt. Dieser Schritt ist erforderlich, um Manipulationen an Salt-Werten durch Benutzer zu verhindern, da überprüft wird, ob der Salt-Wert tatsächlich vom Server generiert wurde.
  3. Das Flash-Spiel kombiniert den Salt-Wert mit dem gemeinsamen Geheimnis, dem Highscore-Wert und anderen relevanten Informationen (Spitzname, IP, Zeitstempel) und berechnet einen Hash. Diese Informationen werden dann zusammen mit dem Salt-Wert, dem Highscore und anderen Informationen über HTTP GET oder POST an das PHP=) - Backend zurückgesendet.
  4. Der Server kombiniert die empfangenen Informationen auf dieselbe Weise wie auf dem Client und berechnet einen Hash, um zu überprüfen, ob dieser mit dem vom Client bereitgestellten übereinstimmt. Anschließend wird überprüft, ob der Salt-Wert weiterhin gültig ist, wie in der Liste der ausstehenden Abfragen aufgeführt. Wenn beide Bedingungen erfüllt sind, schreibt es den Highscore in die Highscore-Tabelle und gibt eine signierte "Erfolg" -Nachricht an den Client zurück. Außerdem wird der Salt-Wert aus der Liste der ausstehenden Abfragen entfernt.

Bitte beachten Sie, dass die Sicherheit einer der oben genannten Techniken gefährdet ist, wenn der Benutzer jemals auf das gemeinsame Geheimnis zugreifen kann

Alternativ kann ein Teil dieses Hin und Her vermieden werden, indem der Client gezwungen wird, über HTTPS mit dem Server zu kommunizieren, und sichergestellt wird, dass der Client so vorkonfiguriert ist, dass er nur Zertifikaten vertraut, die von einer bestimmten Zertifizierungsstelle signiert wurden, auf die nur Sie Zugriff haben .

18
stormlash

Ich mag das, was tpqf gesagt hat, aber anstatt ein Konto zu deaktivieren, wenn Betrug entdeckt wird, implementiere ich einen Honeypot. Immer wenn sie sich einloggen, sehen sie ihre gehackten Scores und ahnen nie, dass sie als Troll markiert wurden. Google für "phpBB MOD Troll" und Sie werden einen genialen Ansatz sehen.

11
DGM

Ich habe eine Art Workaround gemacht ... Ich hatte einen Fehler, bei dem die Punktzahl inkrementiert wurde (Sie erhalten immer +1 Punktzahl). Zuerst fing ich an, von einer zufälligen Zahl zu zählen (sagen wir mal 14) und als ich die Punkte anzeigte, zeigte ich 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 im Speicher sein). Zweitens, da ich weiß, was der nächste Punkt sein soll ... habe ich die Adobe-Kryptobibliothek verwendet, um den Hash des nächsten Punktes zu erstellen sollte sein. Wenn ich die Scores erhöhen muss, überprüfe ich, ob der Hash der erhöhten Scores gleich dem Hash sein soll. Wenn der Cracker die Punkte im Speicher geändert hat, sind die Hashes nicht gleich. Ich führe eine serverseitige Überprüfung durch und als ich vom Spiel und vom PHP verschiedene Punkte erhielt, weiß ich, dass es sich um Betrug handelte. Hier ist ein Ausschnitt meines Codes (ich verwende die Adobe Crypto Libraty MD5-Klasse und Random Cryptography Salt. CallPhp () ist meine serverseitige Validierung.)

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-Verstopfung konnte ich die Cracker stoppen. Wenn ich die Partituren an den Server sende, verwende ich außerdem meine eigene kleine Verschlüsselungs-/Entschlüsselungsfunktion. So ähnlich (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 zusammen mit anderen Fake-Vars und es geht einfach verloren ... Es ist eine Menge Arbeit für ein kleines Flash-Spiel, aber wo es um Preise geht, werden manche Leute einfach gierig. Wenn Sie Hilfe benötigen, schreiben Sie mir eine PM.

Prost, Ico

In der akzeptierten Antwort erwähnt tqbf, dass Sie einfach eine Speichersuche nach der Bewertungsvariablen durchführen können ("Meine Bewertung ist 666, also suche ich nach der Nummer 666 im Speicher").

Daran führt ein Weg vorbei. Ich habe eine Klasse hier: http://divillysausages.com/blog/safenumber_and_safeint

Grundsätzlich haben Sie ein Objekt, um Ihre Punktzahl zu speichern. Im Setter multipliziert es den übergebenen Wert mit einer Zufallszahl (+ und -) und im Getter dividiert man den gespeicherten Wert durch den Zufallsmultiplikator, um das Original zurückzugewinnen. Es ist einfach, hilft aber dabei, die Speichersuche zu stoppen.

Schauen Sie sich auch das Video von einigen Leuten an, die hinter der PushButton-Engine stehen und über verschiedene Möglichkeiten zur Bekämpfung von Hacking sprechen: http://zaa.tv/2010/12/the-art-of- Hacking-Flash-Spiele / . Sie waren die Inspiration hinter der Klasse.

4
divillysausages

Sie können keinen Daten vertrauen, die der Client zurückgibt. Die Validierung muss auf der Serverseite durchgeführt werden. Ich bin kein Spieleentwickler, aber ich mache Business-Software. In beiden Fällen kann Geld involviert sein und die Leute werden die clientseitigen Verschleierungstechniken durchbrechen.

Senden Sie die Daten möglicherweise regelmäßig an den Server und führen Sie eine Überprüfung durch. Konzentrieren Sie sich nicht auf den Client-Code, auch wenn sich Ihre Anwendung dort befindet.

3
zeller

Das Verschlüsseln mit einem bekannten (privaten) umkehrbaren Schlüssel ist die einfachste Methode. Ich bin nicht ganz mit AS beschäftigt, daher bin ich mir nicht sicher, welche Arten von Verschlüsselungsanbietern es gibt.

Sie können aber auch Variablen wie die Länge des Spiels (wieder verschlüsselt) und die Anzahl der Klicks angeben.

Alle Dinge wie diese können rückgängig gemacht werden, also überlegen Sie, eine Menge Junk-Daten einzuspeisen, um die Leute vom Geruch abzuhalten.

Bearbeiten: Es könnte sich lohnen, in einigen PHP= Sessions mitzuschmeißen. Starten Sie die Session, wenn Sie auf "Spiel starten" klicken und (wie der Kommentar zu diesem Beitrag besagt) die Zeit protokollieren Sie können überprüfen, ob sie tatsächlich ein offenes Spiel haben und nicht zu früh oder zu groß punkten.

Es könnte sich lohnen, einen Skalar zu erarbeiten, um festzustellen, wie hoch die maximale Punktzahl pro Sekunde/Spielminute ist.

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

3
Oli

Nach meiner Erfahrung wird dies am besten als Social-Engineering-Problem und nicht als Programmierproblem angegangen. Anstatt sich darauf zu konzentrieren, das Betrügen unmöglich zu machen, konzentrieren Sie sich darauf, es langweilig zu machen, indem Sie die Anreize zum Betrügen entfernen. Wenn der Hauptanreiz zum Beispiel öffentlich sichtbare Highscores sind, kann eine Verzögerung beim Anzeigen von Highscores das Betrügen erheblich reduzieren, indem die positive Rückkopplungsschleife für Betrüger entfernt wird.

3
Scott Reynen

Sie sprechen über das sogenannte "Client Trust" -Problem. Weil der Client (in diesem Fall eine SWF-Datei, die in einem Browser ausgeführt wird) etwas tut, für das er entwickelt wurde. Speichern Sie einen Highscore.

Das Problem ist, dass Sie sicherstellen möchten, dass die Anforderungen zum Speichern der Partitur von Ihrem Flash-Film stammen und nicht von einer beliebigen HTTP-Anforderung. Eine mögliche Lösung hierfür besteht darin, ein vom Server zum Zeitpunkt der Anforderung generiertes Token in die SWF-Datei zu codieren (unter Verwendung von flasm ), das der Anforderung beigefügt sein muss, um einen Highscore zu speichern. Sobald der Server diese Punktzahl gespeichert hat, ist das Token abgelaufen und kann nicht mehr für Anforderungen verwendet werden.

Der Nachteil dabei ist, dass ein Benutzer nur einen Highscore pro Laden des Flash-Films senden kann. Sie müssen ihn zwingen, die SWF-Datei zu aktualisieren/neu zu laden, bevor er sie erneut spielen kann, um einen neuen Score zu erhalten.

2
Peter Bailey

Die Art und Weise, wie ein neuer populärer Arcade-Mod es macht, ist, dass er Daten vom Flash zu PHP, zurück zu Flash (oder es neu lädt) und dann zurück zu PHP sendet. Dies ermöglicht es Ihnen, alles zu tun, was Sie wollen, um die Daten zu vergleichen, sowie Post-Daten-/Entschlüsselungs-Hacks und dergleichen zu umgehen. Eine Möglichkeit, dies zu tun, besteht darin, dem Flash 2 zufällige Werte zuzuweisen (die Sie nicht abrufen oder sehen können, selbst wenn Sie einen Echtzeit-Flash-Daten-Grabber ausführen). Dazu wird eine mathematische Formel verwendet, um die Punktzahl mit den zufälligen Werten zu addieren, und diese dann mit zu überprüfen die gleiche Formel, um es umzukehren, um zu sehen, ob die Punktzahl mit ihr übereinstimmt, wenn es schließlich zum PHP am Ende geht. Diese Zufallswerte sind niemals sichtbar, da sie auch die Transaktionsdauer bestimmen. Wenn sie länger als ein paar Sekunden dauern, wird sie auch als Betrug gekennzeichnet, da davon ausgegangen wird, dass Sie den Sendevorgang abgebrochen haben, um die zufälligen Werte zu ermitteln oder den Vorgang auszuführen die Zahlen durch irgendeine Art von Chiffre, um mögliche Zufallswerte zurückzugeben, die mit dem Score-Wert verglichen werden können.

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

2
Vaughn

Ich denke, der einfachste Weg wäre, jedes Mal, wenn das Spiel eine hinzuzufügende Punktzahl registriert und diese dann codiert, paketiert und als String an ein PHP-Skript sendet, einen Aufruf an eine Funktion wie RegisterScore (score) zu tätigen. 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 Punktzahl zu erzwingen, zu einem Dekomprimierungsfehler führen würden.

2
mathieu landry

Immer wenn Ihr Highscore-System auf der Tatsache basiert, dass die Flash-Anwendung nicht verschlüsselte/nicht signierte Highscore-Daten über das Netzwerk sendet, können diese abgefangen und bearbeitet/wiedergegeben werden. Daraus folgt die Antwort: Highscore-Daten verschlüsseln (anständig!) Oder kryptografisch signieren. Dies erschwert es zumindest den Leuten, Ihr Highscore-System zu knacken, da sie den geheimen Schlüssel aus Ihrer SWF-Datei extrahieren müssen. Viele Leute werden wahrscheinlich gleich dort aufgeben. Auf der anderen Seite genügt eine einzelne Person, um den Schlüssel herauszuholen und irgendwo zu posten.

Echte Lösungen erfordern mehr Kommunikation zwischen der Flash-Anwendung und der Highscore-Datenbank, damit diese überprüfen kann, ob eine bestimmte Punktzahl realistisch ist. Dies ist wahrscheinlich kompliziert, je nachdem, welche Art von Spiel Sie haben.

2
Jan Krüger

Es gibt keine Möglichkeit, es vollständig unhackbar zu machen, da es leicht ist, SWF-Dateien zu dekompilieren, und ein erfahrener Entwicklerhacker könnte dann Ihren Code nachverfolgen und herausfinden, wie Sie eventuell verwendete verschlüsselte Systeme umgehen können.

Wenn Sie jedoch einfach verhindern möchten, dass Kinder mit einfachen Tools wie TamperData schummeln, können Sie einen Verschlüsselungsschlüssel generieren, den Sie beim Start an die SWF-Datei übergeben. Verwenden Sie dann beispielsweise http://code.google.com/p/as3crypto/ , um den Highscore zu verschlüsseln, bevor Sie ihn an den PHP code zurückgeben. Dann entschlüsseln Es wird auf dem Server beendet, bevor es in der Datenbank gespeichert wird.

2
David Arno

Normalerweise füge ich "Geisterdaten" der Spielsitzung dem Highscore-Eintrag hinzu. Wenn ich also ein Rennspiel mache, füge ich die Wiederholungsdaten hinzu. Oft haben Sie die Wiederholungsdaten bereits für die Wiederholungsfunktion oder die Ghost Racing-Funktion (Spielen gegen Ihr letztes Rennen oder Spielen gegen den Ghost of Dude # 14 in der Bestenliste).

Diese zu überprüfen ist sehr manuell, 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 des Arsenals von Sicherheitsmaßnahmen sein, auf die bereits andere hingewiesen haben.

Wenn das Ziel darin besteht, die Highscoreliste bis zum Ende der Zeit online zu halten, ohne dass jemand sie ansehen muss, bringt Ihnen dies nicht viel.

2
Lucas Meijer

Dies ist nur möglich, indem die gesamte Spiellogik auf dem Server beibehalten wird, wodurch die Punktzahl auch intern gespeichert wird, ohne dass der Benutzer dies weiß. Aus wirtschaftlichen und wissenschaftlichen Gründen kann die Menschheit diese Theorie nicht auf alle Spieltypen außer rundenbasiert anwenden. Für z.B. Es ist rechenintensiv und schwierig, die Physik auf dem Server zu halten. Selbst wenn Sie Schach spielen, kann jeder das KI-Schachspiel dem Gegner anpassen. Daher sollte besser Multiplayer-Spiele auch On-Demand-Kreativität enthalten.

2
placeohlder

Es ist nicht wirklich möglich, das zu erreichen, was Sie wollen. Die Interna der Flash-App sind immer teilweise zugänglich, insbesondere wenn Sie wissen, wie man Dinge wie CheatEngine verwendet, was bedeutet, dass die Kommunikation zwischen Ihrer Website und dem <-> Browser-Server immer noch sicher ist relativ einfach zu überwinden sein.

1
Mark Webster

Es könnte eine gute Idee sein, mit dem Backend über AMFPHP zu kommunizieren. Es sollte zumindest die Faulen davon abhalten, die Ergebnisse über die Browserkonsole zu veröffentlichen.

1
m1gu3l