suit: Highscore aus Flash fälschungssicher an PHP übergeben

Hallo,

wie allseits bekannt sein dürfte: ich hab' von Flash nicht viel Ahnung, aber ein Problem, dass es zu lösen gilt.

Aus eine Flash-Spiel soll ein Highscore übergeben werden - wie mache ich das am besten?

Probleme:
Wie verhindere ich, dass der Score gefälscht werden kann (wenn das Flash einfach ein Script aufruft und den Score per GET übergibt). Verschlüsseln ist klar - aber wie? Welchen Algorithmus kann man dafür verwenden sodass das ganze in PHP auch wieder entschlüsselt werden kann?

Taugt ein asymetrischer Algorithmus etwas - unter der Voraussetzung, dass der Schlüssel lang genug ist und geheimgehalten wird, oder kann man dann einfach das Flash dekompilieren und kommt ran?

Die zweite Frage - wie verhindere ich am besten, dass ein Highscore 2x beansprucht wird. d.h., wie mache ich im Flash den Score eindeutig (der Benutzername wird erst später beim Verspeichern im PHP-Script bestimmt)?

Meine Überlegung: eine Zeit und IP-Adresse mit übergeben, aber wie komme ich im Flash an die IP? Und was passiert, wenn 2 Leute zur selben Zeit mit derselben IP einen Highscore erreichen? Ist das vernachlässigbar?

Danke vorab für die Antworten.

  1. Hi there,

    wie allseits bekannt sein dürfte: ich hab' von Flash nicht viel Ahnung, aber ein Problem, dass es zu lösen gilt.

    Dein Problem dürft' allgemeinerer Natur sein.

    Aus eine Flash-Spiel soll ein Highscore übergeben werden - wie mache ich das am besten?

    du rufst eine URL auf und hängst den Highscore hinten dran;)

    Probleme:
    Wie verhindere ich, dass der Score gefälscht werden kann (wenn das Flash einfach ein Script aufruft und den Score per GET übergibt). Verschlüsseln ist klar - aber wie? Welchen Algorithmus kann man dafür verwenden sodass das ganze in PHP auch wieder entschlüsselt werden kann?

    is eigentlich egal, ich hab mir da irgendwann einmal etwas gebaut, das ziemlich sprachen-neutral ist, sich selbst verschlüsselt und auch noch eine Prüfsumme einbaut. Ich meine, nachbauen kann man alles, die Frage ist halt immer, mit welchem Aufwand.

    Taugt ein asymetrischer Algorithmus etwas - unter der Voraussetzung, dass der Schlüssel lang genug ist und geheimgehalten wird, oder kann man dann einfach das Flash dekompilieren und kommt ran?

    soweit mir ein Flashguru (;) einmal versichert hat, ist es nicht einfach, aber durchaus zu bewerkstelligen, den Flashsource einigermaßen wiederherzustellen. Ich persönlich versteh' von Flash vermutlich noch weniger als Du;)

    Die zweite Frage - wie verhindere ich am besten, dass ein Highscore 2x beansprucht wird. d.h., wie mache ich im Flash den Score eindeutig (der Benutzername wird erst später beim Verspeichern im PHP-Script bestimmt)?

    Datum und Uhrzeit der Hightscoregenerierung in den Score einfliessen lassen. Dein PHP-Skript muss das dann halt aufdröseln.

    Meine Überlegung: eine Zeit und IP-Adresse mit übergeben, aber wie komme ich im Flash an die IP? Und was passiert, wenn 2 Leute zur selben Zeit mit derselben IP einen Highscore erreichen? Ist das vernachlässigbar?

    Wenn Du Microsekunden berücksichtigst kannst Du das imho komplett ignorieren. Ich würd sogar die IP ignorieren. Und wenn - ich nehm' einmal an, Du steuerst mit Deinem Highscore kein Kernkraftwerk, oder?

  2. Hallo,

    Probleme:
    Wie verhindere ich, dass der Score gefälscht werden kann (wenn das Flash einfach ein Script aufruft und den Score per GET übergibt). Verschlüsseln ist klar - aber wie? Welchen Algorithmus kann man dafür verwenden sodass das ganze in PHP auch wieder entschlüsselt werden kann?

    Du könntest beim Start des Flashmovies mit Loadvars eine PHP-Datei aufrufen, welche eine zufällige Zeichenkette erzeugt, in einer Sessionvariable speichert und an Flash übergibt. Beim Übergeben des HighScores per SendAndLoadvars prüfst Du dann, ob die beiden Zeichenketten übereinstimmen.

    Meine Überlegung: eine Zeit und IP-Adresse mit übergeben, aber wie komme ich im Flash an die IP? Und was passiert, wenn 2 Leute zur selben Zeit mit derselben IP einen Highscore erreichen? Ist das vernachlässigbar?

    Die IP und Zeit kannst Du im PHP-Skript doch direkt auslesen - warum übergeben?

    Grüße Basti

    1. Moin Moin!

      Du könntest beim Start des Flashmovies mit Loadvars eine PHP-Datei aufrufen, welche eine zufällige Zeichenkette erzeugt, in einer Sessionvariable speichert und an Flash übergibt. Beim Übergeben des HighScores per SendAndLoadvars prüfst Du dann, ob die beiden Zeichenketten übereinstimmen.

      Das knacke ich mit ein paar Zeilen Perl.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
      1. »» Du könntest beim Start des Flashmovies mit Loadvars eine PHP-Datei aufrufen, welche eine zufällige Zeichenkette erzeugt, in einer Sessionvariable speichert und an Flash übergibt. Beim Übergeben des HighScores per SendAndLoadvars prüfst Du dann, ob die beiden Zeichenketten übereinstimmen.

        Das knacke ich mit ein paar Zeilen Perl.

        Dafür braucht man nichtmal Perl - da reicht es, die HTTP-Requests anzusehen, dann kommt man an die Zufallszahl ran und kann sich sein Flash selbst nach belieben starten

        1. Moin Moin!

          »» »» Du könntest beim Start des Flashmovies mit Loadvars eine PHP-Datei aufrufen, welche eine zufällige Zeichenkette erzeugt, in einer Sessionvariable speichert und an Flash übergibt. Beim Übergeben des HighScores per SendAndLoadvars prüfst Du dann, ob die beiden Zeichenketten übereinstimmen.
          »»
          »» Das knacke ich mit ein paar Zeilen Perl.

          Dafür braucht man nichtmal Perl - da reicht es, die HTTP-Requests anzusehen, dann kommt man an die Zufallszahl ran und kann sich sein Flash selbst nach belieben starten

          Jau, aber mit den paar Zeilen Perl kann ich das vollautomatisch. ;-)

          Alexander

          --
          Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  3. Moin Moin!

    Probleme:
    Wie verhindere ich, dass der Score gefälscht werden kann

    Gar nicht. Ein Angreifer hat die vollständige Kontrolle über den Flash-Client und seine Umgebung, er kann sich mit Flash-Decompilern auch einen brauchbaren Quelltext verschaffen. Alle Schlüssel im Flash kann er ebenfalls extrahieren, außerdem kann er die gesamte Kommunikation mit dem Server überwachen und ggf. simulieren.

    (wenn das Flash einfach ein Script aufruft und den Score per GET übergibt). Verschlüsseln ist klar - aber wie? Welchen Algorithmus kann man dafür verwenden sodass das ganze in PHP auch wieder entschlüsselt werden kann?

    Jeden beliebigen. Actionscript und PHP sind turing-vollständig, damit kannst Du alle bekannten Algorithmen implementieren, wenn Du nicht auf vorhandene Implementationen zurückgreifen willst.

    Taugt ein asymetrischer Algorithmus etwas - unter der Voraussetzung, dass der Schlüssel lang genug ist und geheimgehalten wird, oder kann man dann einfach das Flash dekompilieren und kommt ran?

    Egal wie, der Angreifer kann den Client vollständig kontrollieren. Bei dem Szenario kannst Du nur verlieren.

    Du kannst es einem Angreifer nur schwerer machen, z.B. indem Du dich gegen Replay-Attacken absicherst.

    Aber mit dem Flash-Quelltext kann ein Angreifer die komplette Kommunikation, die während eines Top-Spiels ablaufen würde, vollständig simulieren, inklusive aller Verschlüsselungen, Verschleierungen, und zwischenzeitlich generierter Keys.

    So lange du die Spielumgebung nicht kontrollieren kannst, kannst Du falsche Scores nicht verhindern.

    Die zweite Frage - wie verhindere ich am besten, dass ein Highscore 2x beansprucht wird. d.h., wie mache ich im Flash den Score eindeutig (der Benutzername wird erst später beim Verspeichern im PHP-Script bestimmt)?

    Du speicherst die Punktestände natürlich auf dem Server, und dort liegt auch die Auswertelogik.

    Meine Überlegung: eine Zeit und IP-Adresse mit übergeben,

    Was soll das bringen?

    aber wie komme ich im Flash an die IP?

    Gar nicht. Wenn, dann machst Du das auf dem Server über die Client-Adresse.

    Und was passiert, wenn 2 Leute zur selben Zeit mit derselben IP einen Highscore erreichen? Ist das vernachlässigbar?

    Nein. Proxies und NAT-Router kommen öfter vor, als Du denkst.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Was soll das bringen?

      Um einen bereits erspielten Score eindeutig zu machen - allerdings bringt das in anbetracht der Tatsache nichts, wenn ein flash einfach dekompilierbar ist.

      1. Moin Moin!

        »» Was soll das bringen?

        Um einen bereits erspielten Score eindeutig zu machen - allerdings bringt das in anbetracht der Tatsache nichts, wenn ein flash einfach dekompilierbar ist.

        Eben. Es bringt nichs, so lange das Spiel unter Kontrolle des Angreifers läuft.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".