Mailinglisten-Archive |
Oliver Richter wrote: Hi Oliver > 2.) Klickt der User auf der Link für das Quiz, kommt er auf eine kleine Info-Seite, auf der er darauf hingewiesen wird, dass er nur einen Versuch hat und dass dieser Versuch auf Zeit läuft. > Es wird ein Cookie gesetzt mit dem Wert 1 ("vor dem Quiz"). > > 3.) Mit dem "Start"-Button gelangt der User zum eigentlichen Formular (quiz.php). > Als erstes auf dieser Seite steht eine Abfrage nach dem Cookie: Hat es den Wert 1, wird es auf 2 ("am Quiz teilgenommen") gesetzt und das Formular wird angezeigt; Hat es den Wert 2, wird die Auswertung gestartet und das Ergebniss in die Datenbank eingetragen. Die soll versuchen, den User daran zu hindern, das Formular ein weiteres mal aufzurufen. Wer also das Formular aufruft, sich die Fragen merkt/notiert, sich die Antworten raussucht und das Formular dann ausfüllen will, landet direkt bei der Auswertung und erhällt somit keine Punkte. Der "Timer" ist mit einem einfachen meta refresh realisiert. > Dieses Konzept ist nicht nur in wenigen Minuten entstanden, sondern wohl auch voller "Löcher". Sicher sind die Cookies eines davon, aber ich galube auch, dass man den Timer leicht austricksen kann, bin mir aber nicht sicher. > Es wäre sehr hilfreich, wenn ihr mir die möglichen Schwachstellen aufzeigen und am besten einen Weg es besser zu realisieren zeigen könntet. > Ich würde auf jeden Fall nicht nur den Wert 1 oder 2 speichern. Speichere am besten stattdessen oder zusätzlich eine timestamp, die die Serverzeit festhält, zu der Dein Benutzer sein Quiz startet und werte die Zeiten gegeneinander aus. Klar, die Werte im Cookie sind fälschbar. Deswegen wäre ein anderer Ansatz: Erzeuge ein GUID (z.B. ein md5 hash, oder einfach die SessionID), gib dieses als Wert in Deinen Cookie und erzeuge eine temporäre Datei auf dem Server, die als Namen diese ID bekommt. Die im Cookie gespeicherte ID verfällt automatisch, wenn der Benutzer sein Quiz beendet, d.h. es wird auf Serverseite die Timestamp zum Zeitpunkt des Quiz-Endes mit der Erstell-Zeit (filectime) der GUID-datei verglichen. Wenn der Benutzer nicht innerhalb von 15 Minuten fertig geworden ist, wird Dein Fehler ausgegeben. Du kannst natürlich alternativ (wenn ein DB-Backend vorhanden ist) die Timestamps und GUIDs mit dieser verwalten. HTH -- Dennis Sterzenbach
php::bar PHP Wiki - Listenarchive