Manipulation meines Highscore-Scripts
Rainer
- php
Guten Tag
Ich habe ein Spiel (Java-Applet) in eine HTML-Seite eingebaut. Nach Ende des Spiels wird die Punktzahl in ein "hidden"-Formularfeld eingetragen und dann wird das Formular an ein PHP-Script abgesendet.
Nun hat es leider jemand geschafft, diese Highscore zu manipulieren. Wie dies funktioniert, ist mir bekannt: Derjenige/diejenige hat ein Formularfeld erstellt (auf dem eigenen PC) und schickt dieses nun mit einem Formularfeld, welches den Namen des "hidden"-Feldes trägt, ab und kann damit eine beliebige Punktzahl eintragen.
Nun habe ich zwei Fragen:
1. Welche Möglichkeiten gibt es, diesen Vorgang zu verhindern?
2. Wie kann ich verhindern, dass der Spieler nach Ende des Spieles einfach die Seite aktualisiert und sich damit nochmal in die Highscore einträgt (weil er die Formulardaten dann noch einmal absendet)?
Danke für eure Hilfe!!!
Gruß
Rainer
Moin!
Nun habe ich zwei Fragen:
- Welche Möglichkeiten gibt es, diesen Vorgang zu verhindern?
Keine, die wirkt. Nur welche, die den Aufwand erhöhen.
- Wie kann ich verhindern, dass der Spieler nach Ende des Spieles einfach die Seite aktualisiert und sich damit nochmal in die Highscore einträgt (weil er die Formulardaten dann noch einmal absendet)?
Redirect von der Eintragungsseite hin zur Ergebnisausgabeseite. Dann lädt der Reload keinen POST-Request nochmal (unter erneuter Absendung der Ergebnisse), sondern den umgeleiteten GET-Request.
- Sven Rautenberg
Guten Tag!
Keine, die wirkt. Nur welche, die den Aufwand erhöhen.
Und welche gäbe es da?
Redirect von der Eintragungsseite hin zur Ergebnisausgabeseite. Dann lädt der Reload keinen POST-Request nochmal (unter erneuter Absendung der Ergebnisse), sondern den umgeleiteten GET-Request.
Und wenn der Header schon gesendet ist?
Gruß
Rainer
Moin!
Keine, die wirkt. Nur welche, die den Aufwand erhöhen.
Und welche gäbe es da?
Im Prinzip hast du dasselbe Problem, wie jemand, der clientseitig einen Passwortschutz realisieren will. Auch das klappt niemals.
Deine Optionen wären also, nicht nur billig das Ergebnis zu senden, sondern beispielsweise noch eine Prüfsumme zu generieren, die du dann auf dem Server mit gewissen Informationen vergleichst und somit das Ergebnis auf Gültigkeit testen kannst.
Allerdings: Du lieferst den Mechanismus zum Generieren der Prüfsumme natürlich im Java-Applet mit. Da kann man reinschauen und sehen, wie du das machst. Und dann eine geeignete Prüfsumme herstellen und wieder Highscoremaster werden.
Redirect von der Eintragungsseite hin zur Ergebnisausgabeseite. Dann lädt der Reload keinen POST-Request nochmal (unter erneuter Absendung der Ergebnisse), sondern den umgeleiteten GET-Request.
Und wenn der Header schon gesendet ist?
Dann ist das die falsche Reihenfolge, in der du die Aufgabe angehst.
Das Script, was die POST-Daten annimmt, gibt nur den Redirect-Header aus und leitet damit weiter auf ein Script, welches z.B. die Highscoretabelle anzeigt. Script 1 und Script 2 können identisch sein, sich aber je nach Request-Art bzw. Parametern unterschiedlich verhalten.
- Sven Rautenberg
Hello,
mit einem Java-Applet müsstest Du eine hervorragende Möglichkeit haben, zumindest eine Plausibilitätsprüfung für den Wert aufzubauen.
Wenn ich mich recht entsinne, sind die Dinger doch compiliert, oder?
Nix ist natürlich absolut sicher...
Übertrag einen Schlüssel für das Formular in einem zweiten hidden-Feld. Im Java-Applet baust Du aus dem Schlüssel und dem Wert einen reversibel codierten Wert auf, der dann im zweiten hideen Field steht.
Im PHP-Script wird nun erst der Form-Schlüssel geprüft, damit er nur einmal funktioniert. Damit ist auch das Doppelposting weg. Und dann wird mit Hilfe des Schlüssels und des Algorithmus der Wert ermittelt.
Wenn er plausibel ist, wird er eingetragen.
Da Java-Applets i.d.R. sowieso mehr als drei Zeilen *gg* haben, dürfte der Aufwand angemessen sein.
Grüße
Tom
hi
Im Prinzip hast du dasselbe Problem, wie jemand, der clientseitig einen Passwortschutz realisieren will. Auch das klappt niemals.
md5 gibt es als javascript-implementation und wenn der name der "geschützten seite" z.b. der md5-hash-wert ist, wird es zumindest ziemlich schwierig, da ranzukommen.
auch mit javascript lässt sich so einiges anstellen: http://www.diabolo666.com/2002/index2.htm
PS: oops, sehe grad, die hackit's sind nicht mehr da. :-(
Deine Optionen wären also, nicht nur billig das Ergebnis zu senden, sondern beispielsweise noch eine Prüfsumme zu generieren, die du dann auf dem Server mit gewissen Informationen vergleichst und somit das Ergebnis auf Gültigkeit testen kannst.
er könnte doch auch direkt das applet die daten an den server senden lassen, oder?
für jede spielsitzung noch eine sessionid dazu, die das applet auch direkt vom server abfragt (nicht als parameter) und es sollte schon viel arbeit machen, da was zu faken.
Allerdings: Du lieferst den Mechanismus zum Generieren der Prüfsumme natürlich im Java-Applet mit. Da kann man reinschauen und sehen, wie du das machst. Und dann eine geeignete Prüfsumme herstellen und wieder Highscoremaster werden.
freilich, wer den aufwand nicht scheut, wegen eines highscores so etwas auseinanderzunehmen, vor dem gibt es keine sicherheit.
freundl. grüsse, raik
Hallo,
- Welche Möglichkeiten gibt es, diesen Vorgang zu verhindern?
Keine.
- Wie kann ich verhindern, dass der Spieler nach Ende des Spieles einfach die Seite aktualisiert und sich damit nochmal in die Highscore einträgt (weil er die Formulardaten dann noch einmal absendet)?
dclp-FAQ: Wie verhindere ich mehrfaches Absenden eines Formulars?
[http://www.dclp-faq.de/q/q-formular-mehrfach.html]
Gruesse,
Thomas
dclp-FAQ: Wie verhindere ich mehrfaches Absenden eines Formulars?
Guten Tag!
Danke für eure Antworten, aber gibt es nicht was etwas einfacheres. Ist vielleicht die Abfrage des Referrers eine Möglichkeit, um zu prüfen, ob die Daten von einer Seite auf dem eigenen Server kommen? Oder kann man das "faken"?
Gruß
Rainer
Hello,
Ist vielleicht die Abfrage des Referrers eine Möglichkeit, um zu prüfen, ob die Daten von einer Seite auf dem eigenen Server kommen? Oder kann man das "faken"?
Das kann man in manchen Browsern abschalten und es gibt auch welche, in denen man das frei einstellen kann.
Allerdings werden die nicht unbedingt weit verbreitet sein.
Wenn Du das Java-Applet selbst geschrieben hast, dann sollte Dir kleine Funktion für die Sicherheit keine Probleme bereiten.
Grüße
Tom
Moin!
Danke für eure Antworten, aber gibt es nicht was etwas einfacheres.
Du _hast_ bereits etwas einfaches, und das wurde manipuliert. Alles andere ist komplizierter.
Aber es kann eben auch manipuliert werden. Es gibt da keinerlei Ausweg.
Du gibst dem Benutzer das Programm in die Hand, mit dem er einen gültigen Highscore ermitteln kann. Du kannst aber nicht kontrollieren, ob die Highscores reell erspielt wurden, oder ob sie geschummelt wurden. Das Kochrezept, mit dem gültige Highscore-Meldungen an deinen Server gesendet werden können, kann vom Angreifer beliebig lange untersucht werden, um den Mechanismus und die Berechnungsformel zu verstehen. Egal ob du irreversible MD5-Summen oder irgendeine reversible Rechnung verwendest, ob du gewisse Prüfsummen einbaust oder direkt aus dem Applet heraus mit dem Server kommunizierst: Immer hängt die Korrektheit der Übertragung von der Vertrauenswürdigkeit des Benutzers ab. Und die ist nicht gegeben, wenn du nicht danebenstehst und dem Benutzer genau auf die Finger guckst, was er bzw. sein Prozessor so machen, wenn dein Applet gerade nicht ausgeführt wird.
Ist vielleicht die Abfrage des Referrers eine Möglichkeit, um zu prüfen, ob die Daten von einer Seite auf dem eigenen Server kommen? Oder kann man das "faken"?
Man kann absolut alles faken, was ein Browser irgendwie an deinen Server senden kann. Je mehr Daten "stimmen" müssen, desto schwieriger wird die Fälschung natürlich, aber sie wird niemals unmöglich. Ab einem gewissen Punkt der Komplexität der Datenübertragung zu deinem Server wird man andere Ansatzpunkte finden, um zu Highscores zu kommen. Beispielsweise das Applet angreifen, dort die Punkteberechnungsformel ändern und so für Aktionen, die nur einen Punkt bringen sollten, 100 oder 1.000.000 Punkte zu kassieren. Diese falsch erspielten Punkte werden dann vom korrekten Algorithmus verpackt und versendet.
Ich hoffe, du siehst ein, dass es ein absolut unmögliches Unterfangen ist, sichere Highscores zu empfangen. Daran versucht sich die Spieleindustrie schon, seit es Spiele gibt, insbesondere seit es Onlinespiele gibt, und hat in letzter Konsequenz wenig Erfolg. Betrüger gibt es immer, die anderen den Spielspaß nehmen, weil sie das Spiel so manipuliert haben, dass sie selbst einen Vorteil erhalten. "Cheater" werden sie genannt, und sie sind bei den großen Onlinespielen eine richtige Plage, gegen die noch kein Kraut gewachsen ist.
Einzige Chance: Nicht der Client darf die Gewinnsituation und Highscore-Rechnung anstellen, sondern der Server. Die Spielereingaben werden über das Applet nur einfach an den Server weitergereicht, sozusagen als verlängerte Tastaturleitung. Über das Programm auf dem Server hast du ja die Kontrolle, ebenso dann über gültige Eingaben und die Berechnung des Highscores. Allerdings muß man dazu natürlich ständig online sein, die Methode erfordert bei Action-Spielen außerdem eine sehr verzögerungsarme Leitung (ansonsten werden Benutzer mit langsamen Leitungen (PING-Zeit) wie z.B. Modems enorm benachteiligt.
Keiner der Lösungsansätze ist jedoch "einfach".
- Sven Rautenberg
Hi,
ohne mir jetzt die zahlreichen Antworten noch mal durchzulesen schreibe ich einfach mal meine Antworten.
Den Reload und den doppelten Eintrag kannst du dir ersparen, wenn du nach dem Eintrag einfach mittels header("Location: ..."); auf eine andere Seite umleitest.
Beim anderen würde ich eine Quersumme angeeb
E7
Moin!
ohne mir jetzt die zahlreichen Antworten noch mal durchzulesen schreibe ich einfach mal meine Antworten.
Das hättest du aber lieber mal tun sollen. Denn nur dann siehst du, ob du dir die Antwort sparen kannst. Und das hättest du in diesem Fall.
Den Reload und den doppelten Eintrag kannst du dir ersparen, wenn du nach dem Eintrag einfach mittels header("Location: ..."); auf eine andere Seite umleitest.
Wurde schon gesagt.
Beim anderen würde ich eine Quersumme angeeb
Hilft nicht wirksam.
- Sven Rautenberg