Moin!
Ich möchte einen Mitgliederbereich mit PHP und MySQL realisieren. Dazu möchte ich Sessions und Cookies benutzen.
Mit anderen Worten: Cookiebasierte Sessions. "Sessions" sind praktisch synonym für "Cookies", zumindest bei PHP.
Dazu werde ich ja bei jeder geladenen Seite vorher überprüfen müssen ob der Benutzer eingeloggt ist.
Richtig. Das steht ja aber in den Session-Daten drin, ist also kein Problem.
Ist es jetzt - zumindest bei Sessions - sinnvoll noch jedes Mal das übergebene Passwort und den übergebenen Usernamen zu überprüfen, indem ich auf die Datenbank zugreife, oder kann man da auf die Sicherheit von Sessions vertrauen, dass da keiner "dazwischenpfuschen" kann?
Usernamen und Passwort werden nur ein einziges mal übergeben: Beim Abschicken des Login-Formulars. Daraufhin prüft ein Skript, ob diese Daten gültig sind und gewährt den Zutritt. Es ist unsinnig, in den Sessiondaten diese Authentifizierungs-Informationen zu speichern, um sie bei jedem Seitenzugriff erneut in der Datenbank zu prüfen - es reicht vollkommen aus, das Prüfungsergebnis "ist gültiger User" in den Session-Daten zu speichern und das als Beweis zu nehmen - denn es ist absolut ausreichend.
Man kann sich ja unberechtigt nur einloggen, wenn man eine fremde Session übernehmen könnte. Das ist aber praktisch ausgeschlossen (siehe diverse Postings von mir im Archiv), weil man sich da ewig totsuchen würde. Und wenn es gelingen würde, würde die Flag-Methode keinen Unterschied zur Datenbankfrage-Methode haben: Bei der ersten Methode steht in den übernommenen Session-Daten, dass der User erlaubt eingeloggt ist, bei der zweiten Methode stehen die zu prüfenden Usernamen und Passwort in den übernommenen Session-Daten und werden geprüft.
Als Gegenmaßnahmen kann man natürlich Username und Passwort in ein Cookie speichern - das müßte der Angreifer dann wissen, um angreifen zu können und dann die Session zu übernehmen. Aber mal ehrlich: Wenn er Username und Passwort kennt, warum soll er dann noch die Session übernehmen?
Eine Prüfung, ob der neue Request immer noch von der gleichen IP-Adresse kommt, kannst du knicken: AOL verwendet z.B. diverse Proxys, die IP-Adresse eines Users ist nicht als konstant anzunehmen.
Eine simple PHP-Session ist also vollkommen ausreichend.
Dass Cookies unsicher sind ist klar, da werde ich auf jeden Fall prüfen müssen. Aber durch die ständigen Datenbankzugriffe wird dann bei meheren 100 Usern der Server doch arg lahm oder?
Cookies sind nicht zwingend unsicher - aber du solltest sie eben nicht benutzen, weil sie dir nicht helfen werden, zusätzliche Sicherheit zu produzieren.
Ich weiß, dass es mit htaccess am besten wäre, aber das kann ich hier nicht benutzen.
.htaccess und eine sicher programmierte Session-Lösung (also eine, in die man sich keine Sicherheitslücken aufgrund von eigener Doofheit eingebaut hat) sind als gleich sicher anzusehen.
- Sven Rautenberg
Signatur oder nicht Signatur - das ist hier die Frage!