Ergebnis-Links sicherer machen
-
Hallo,
ich war neulich mal wieder auf einer Tippspeedtest-Seite und habe unten gesehen, dass man sich irgendwo einen Link embedden kann, der zeigen soll, wie gut man beim Test abgeschnitten hat: http://deutscher-speedtest.10-fast-fingers.com/
...src="http://deutscher-speedtest.10-fast-fingers.com/badge/2_wpm_score_FP.png"...
Viele erkennen hier schon, dass man sein Ergebnis leicht "veredeln" kann, indem man die beiden letzten Buchstaben hochzählt. So ähnliche Probleme hat man als Webentwickler durchaus öfter, z.B. eben wie hier, wo sich ein User ein paar Punkte zusammen zocken kann und sich damit im Web brüsten können soll, o.a..
Wie könnte man (als Betreiber der Seite) diesen Link schwerer Manipulierbar machen? Möglichst ohne großen technischen/finanziellen Aufwand. Ergebnis soll ein einfacher Link bleiben, darf aber etwas länger sein (sagen wir mal so +10 bis +20 Zeichen extra).
Nun, ein erster Vorschlag, der mmir spontan einfällt: Das Ergebnis (z.B. 60 WPM) mit einer größeren Primzahl multiplizieren und dann in eine andere Kodierung umwandeln, z.B. Base64url. Den String dann wieder dem Link beifügen. Durch die Multiplikation kann nicht so schnell von einem aufs nächste Spielergebnis durch triviales durchprobieren/raten kommmen, wie in dem Beispiel oben. Also eine leichte Verbesserung, aber natürlch für Informatiker etc. ziemlich leicht zu durchschauen und auszuhebeln. Den Ansatz kann man sicher noch verbessern...
Was für Ideen habt Ihr? Vielleicht eine für den Fall, dass die Möglichkeit besteht etwas in einer DB-Tabelle zu hinterlegen, und eine Idee, wenn es diese Möglichkeit nicht gewährt wird.
Vielleicht gibts ja auch'n Standardansatz für sowas?
-
Ich würd ja die Punktzahl gar nicht in der URL kodieren, sondern den Benutzernamen. Die Punktzahl kommt dann aus der Datenbank, und wird zusammen mit dem Benutzernamen ins Bild gepackt.
-
Hm, mit DB-Tabelle ists wohl trivial, wenn ich nicht grad nen Denkfehler gemacht habe:
Beispiel: Man speichert einfach je einen Datensatz mit generierter Zufallszahl( = Link-Extension) und Spielergebnis.
Bei einer Anfrage schaut man einfach, welches Spielergebis der Zufallszahl zugeordnet ist. Nicht vorhandene Anfragen werden abgelehnt, Fehlerbild ausgegeben o.ä..
Je höher die Zufallszahlen, desto sicherer vor Manipulation (Brute-Force oder so).
-
Eine wie von Dir vorgeschlagene Prüfsumme wäre das Ding, und im Fehlerfall lehnst Du irgendwie ab. Im Falle von Eintragungen in eine Highscore trägst Du zu ca 1% (nicht zufällig, sondern auch berechnet) doch ein, damit der Hacker denkt, er hat es geschafft, und löscht zu zufällig nach Arbeitszeit aussehenden Zeiten wieder raus, damit er denkt, er kämpfe gegen Menschen.
Das Image lädt sich nur, wenn der Referrer dazupaßt. Und solche Sachen mehr. Die sind zwar kein Schutz, aber machen die Sache für Einsteiger erheblich lästiger.
Wenn die Berechnung der Prüfsumme clientseitig geschieht, kannste es auch lassen. Aber Serverseitig willste auch nicht, kannst ja schlecht nach jedem Tastendruck eine Web-Anfrage machen.
Kannst dem Server den kompletten Verlauf schicken, also für jeden Tastendruck, wie viel Zeitabstand er zu seinem Vorgänger hatte. Und das Häppchenweise schicken, nach jeder Zeile oder so. Und zum Schluß die Prüfsumme über diesen Strom. Und beim Server muß die Prüfsumme auch passen und der prüft den Strom auf Plausibilität. Dann muß der Angreifer schon ein Programm dagegen schreiben und so langsam laufen lassen, wie man tippen würde, oder einen Roboter bauen. Dagegen gibt es prinzipiell keinen Schutz, weshalb ich auch nicht zu lange versuchen würde, es zu verhindern.
-
@SG1: Oh, da war jemand ein paar Sekunden schneller als ich
Ja, da haben wir wohl eine ähnliche Idee. Nur den Benutzernamen (wenn es in dem System überhaupt welche gibt, kann ja evtl. auch ein anonymes Spiel sein) würde ich vllt. nicht nehmen. Es könnte ja eine Top 10 Liste mit den Benutzernamen irgendwo veröffentlicht sein. Wenn man erstmal einen Benutzernamen hat und die Kodierung kennt, kann man auch wieder mit nicht allzu großem Aufwand manipulieren, oder?
-
volkard schrieb:
Eine wie von Dir vorgeschlagene Prüfsumme wäre das Ding, und im Fehlerfall lehnst Du irgendwie ab.
Eine Prüfsumme würde ich auch nehmen. Bevor man sich da aber was eigenes unsicheres zurechtbastelt, werfe ich mal HMAC in den Raum. Dafür stellt jede gängige Programmiersprache fertige Funktionen bereit.
-
und mädels, wer ist da mit 664 ganz oben :p
@edit: oO im englischen teil sind die ja noch schneller - hab da noch mal nach gelegt :xmas1: