HTTP Highscore Datenbank (Java <-> PHP)

frostbyte

Aktives Mitglied
Hallo,

Ich habe einige kleine Spiele, bei denen man in einem Spiel eine gewisse Punktzahl erreichen kann. Ich hatte dann eine kleine Datenbank online gebaut, in die man sich eintragen kann, letztlich mit:
Java:
name = JOptionPane.showInputDialog("Dein Name bitte");
URL url = new URL("http://example.com/highscore/score_speichern.php?spiel="+spiel+"&name="+name+"&punkte="+punkte);
url.openStream();

Kurze Zeit darauf machte mich jemand darauf aufmerksam, dass das ganze natürlich nicht sehr sicher sei, jeder könnte einfach irgendwelche Punkte abschicken.

Das ganze würde ich jetzt gerne neu gestalten, so richtig mit Anmeldung (Benutzername und Passwort) sowie Profilseiten für jeden, also dass man sehen kann, welche Punkte man in meinen Spielen erreicht hat.

Wie schaffe ich es, diese Übertragung sicher zu machen? Leider habe ich kein SSL, ansonsten wäre die Sache ja eigentlich recht einfach. Durch irgendwelche Codes oder so?


Und gibt es eine einfache Möglichkeit per Javabefehl eine Webseite im Standardbrowser zu öffnen?
 
Naiver Ansatz um die einfachen Cracks auszuschließen:

1) Statt "GET" mal "PUT" benutzen.
2) Die Daten mit Java verschlüsseln (langer XOR Schlüssel wäre das einfachste) und dann mit PUT zum Server schicken der das ganze wieder entschlüsselt. Nur der weiß erstmal wie man das entschlüsselt.

Letzten endes bleibt alles unsicher. Denn man kann ja deinen Java-Code decompilen, und dann weiß man auch wieder wie die Hoghscore übertragen wird, was dazu führt dass man das nachbauen kann. Aber geht man mal davon aus dass >95% der Leute das nicht tun werden, so ist der Ansatz schon recht sicher ;-). Denn Otto-Normal ScriptKiddie bastelt keine PUT-Anfrage (die man nicht so ohne weiteres mit einem "ich geb mal schnell die URL in den Browser ein und hacke meine Highscore" absetzen kann) und scriptet die verschlüsselung nach...



- Alex
 
Und auf der Serverseite komme ich an die Daten dann per POST?

Sicher wäre es wohl nie wirklich, denn jeder könnte einen Client schreiben, der Punktestände übersendet. Da hilft nur ein Schlüssel irgendwo im Client, der geheim bleiben muss.

Gut, das sollte dann eigentlich erstmal reichen …
 
Man könnte es auch so machen, dass man den Aufruf etwas abänert:
Java:
String hash=PseudoKlasse.md5(spiel+punkte+name+"Konstanter, zufälliger Ottonormalverbraucher-unbekannter Wert");
URL url = new URL("http://example.com/highscore/score_speichern.php?spiel="+spiel+"&name="+name+"&punkte="+punkte+"&hash="+hash);

Und dann auf Serverseite überprüfen ob die Angaben mit dem Hash überinstimmen.
 
Das Problem ist nur, dass Strings ja direkt in der .class Datei stehen, von daher kann man sich ausrechnen, wie man den erzeugt. Aber man kann ja noch auf die Punkte beim Hash etwas draufaddieren, sowas wie 3956, da kommt auch keiner. Gut, dann werde ich das mit einem gesalzenem Hash machen.
 
Ob du nun einen String oder eine Zahl nimmst ist im Prinzip egal(Es sei denn Strings stehehn so in der class-Datei,falls ich deinen letzten Post so vertsehen sollte).
Für eine Zahl könntest du dann noch sowas wie 31415*42+23 in den Programmcode schreiben, dann ist es nicht so einfach lesbar, es sei denn der Compiler optimiert das weg. Da würde ich dir dann allerdings ein ganzzahliges Ergebnis empfehlen, damit du keine Probleme mit evtl unterhsiedlichen genauigkeiten von PHP & JAVA bekommst
 
Muss ich mal schauen, wie das dann in der .class Datei steht, aber genau das hatte mir bei der ganz einfachen Geschichte ja schon den Hals gebrochen, da man den kompletten GET String da einfach ablesen konnte.
 
Aber eins muss dir klar sein: Auslesen kann man das (fast) immer, du kannst Javaprogramme immer dekompilieren. Aber ob das die Mehrzahl der Nutzer macht ist mehr als fraglich...
 
Das letzte Mal hatte nur ein Kumpel (eher bewandert in C und Python) die .class im Texteditor geöffnet und direkt den Code gesehen. So wäre das "sicher" genug.
 
Naja, man sieht direkt aus der Javaklasse manches, aber nicht den gesamten Code.
Evtl hattest du ein Jar-Archiv, in welchem noch .java Dateien lagen? (Irgendein Prgm packt die automatisch mit rein)
 
Ich gehöre zu den eluten die decompiler benutzen ^^ habe dait vmex für source maps so umgebaut das der decompileshuts der maps nciht mehr geht. Allerdings brach man dann mindestens noch etwas Ahnung von Java um das ding wieder compiliert zu bekommen. Wirklcihs ciher bekommstes nnur wennd ud ei spiel berechnungen auffen Server durchführst ^^ aber das sit etwas übertreibe denke ich mal, also einfach versuchen das so unnachvollziehbar zu bauen wie geht. Auch keinen festen key nehmen, sondern den zb aus einem UnixTimestamp + alten maxhighscore generieren (Server seitig dann aber bedenken ungenauigkeiten von 2,3 minuten sind schon mal dabei)
 
Dann noch zb variable Sachen hinzuaddieren (Zb Zufallszahl) und die dann mit 0 multiplizieren oder potentieren
 
Sehr lustig scherzkeks, sinn der aktion mit dem timestamp ist ja das sowohl server als auch client diese daten habe ohne miteinander kommunizieren zu müssen,
 
Was passiert wenn du eine Zufallszahl mit 0 multiplizierst? Was kommt immer raus?
Was passiert wenn du eine Zufallszahl mit 0 potetierst? Was kommt immer raus?

Genau dieser Verwirrungseffekt soll ja eintreten bei Quellcodelesen
 
Achso du meinst das beim decompilieren das ganze komplizierter aussieht.

Meine idee zihlt halt darauf ab das das Zeitfenster in dem ein gesniffter Wert gelten würde verkürzt wird.
 

Neue Themen


Zurück
Oben