Halihallo Wolfgang
Auf dem Server (das ist ein einfacher Webspace , wie man es eben kennt) liegen meine Dateien. Der User meldet sich mit Benutzerkennung und Passwort an. Ich überprüfe bei der Anmeldung Kennung und Passwort und wenn diese OK sind, dann führe ich den Befehl SetCookie(...) aus. Wenn nun der User auf die nächste Seite geht, werden jedesmal davor die Kennung und Passwort überprüft, ansonsten kommt eine Fehlermeldung. Nach einer Stunde wird das Cookie gelöscht und der USer wird ausgelogged. Das ist mal das eine. Hierzu würde ich gerne wissen, ob diese Methode so i.O. ist, oder ob das eher eine schlechte Realisierung eines Login ist.
Ich halte diese Methode für OK. Es sind nur ein, zwei Sachen, denen
du dir bewusst sein musst:
- Nicht jeder hat Cookies aktiviert. Falls du eine - für alle User -
gute Möglichkeit haben willst, solltest du die Daten in einem
Sessionmechanismus speichern und die SessionID und -Key in
der URL auch mitschleppen.
- Loginname und Passwort sollten nicht im Cookie mitgesendet werden,
da diese dann bei jedem Request in plain/text übertragen werden.
Besser wäre auch hier ein Sessionmechanismus, wo die UserID und
dessen Passwort nur einmal übertragen wird und der User später nur
noch über die Sessiondaten identifiziert wird (die Session hat nur
eine beschränkte Gültigkeit und somit würde dem Angreifer nur für
eine bestimmte Zeit der Zugriff gewährt; zudem hat der Angreifer
das Passwort des Kunden nicht, sondern nur einen unbedeutenden
SessionKey).
- Dass der Cookie automatisch nach 1 Stunde verfällt ist alles
andere als sicher. Falls über den Cookie eine
Sessionidentifikation möglich ist, sollten die Sessiondaten
serverseitig (unabhängig vom Cookie) nach 1 Stunde gelöscht
werden.
Ich hatte es davor mit Session-Variablen probiert, die wurden aber überschrieben, wenn sich zwei Benutzer angemeldet haben. Dann hat der erste plötzlich die Rechte und Daten des zweiten. Deshalb bin ich auf die Cookie-Lösung ausgewichen, die auch einwandtfrei funktioniert.
Nun, das halte ich für einen Fehler deinerseits, denn das
funktioniert wunderbar. PHP generiert zu jeder Session eine SessionID
und einen SessionKey. Diese beiden Informationen werden entweder über
die URL oder über Cookies übertragen und identifizieren so die
Session. Eigentlich macht der Sessionmechanismus von PHP nichts
anderes als du auch, nur mit dem Vorteil, dass die Daten eben nicht
jedesmal übertragen werden, sondern in einer temporären Datei auf dem
Server gespeichert werden.
Zudem wirst auch du wohl dasselbe Problem haben, denn wenn der User
sich zweimal einloggt, wird der alte Cookie in jedem Fall gelöscht
bzw. mit den neuen Daten überschrieben.
Wenn dein User plötzlich mit Rechten eines anderen ausgestattet wird,
ist dies wohl ein Programmierfehler von dir.
In der Datenbankverbindung, die ich angebe, habe ich ja einen Benutzer, die DB selbst, und ein Kennwort, sowie der "localhost". Wenn sich nun wie oben beschrieben mehrere Benutzer gleichzeitig anmelden, greifen diese ja alle mit dem gleichen Benutzername und PSAswort auf die DB zu.
Nein tun sie nicht. Dein Script greift jedesmal mit gleichem
Benutzernamen und Passwort auf die Datenbank zu und das ist auch
in Ordnung. Das einzige was wichtig ist, ist, dass der Benutzer nie
selber das Passwort und Login sieht und die Datenbank Zugriffe von
anderen Domains als localhost ausschliesst. So müsste der Benutzer
erstmal Zugriff auf die Shell (z.B. auch über ein nicht sicheres
Script, dass Befehle auf der Shell ausführt) haben, sodass er auf
die Datenbank zugreifen kann.
Da ist jetzt meine Frage. Muss ich für jeden Benutzer der auf die DB zugreifen will auch einen Benutzer bei der DB angeben, oder können mehrere Clients gleichzeitig über den gleichen DB-Benutzernamen und Passwort auf die DB zugreifen?
Nein, das halte ich für sinnlos, wenn die Abbildung der User sogar
auf Datenbankebene erfolgt. Das einzige was du umbedingt
ausschliessen musst, ist, dass ein unauthentifizierter User auf deine
Webapplikation zugreifen kann. Eine Benutzeridentifikation auf Seiten
der Datenbank ist in den meisten Fällen zwecklos, da diese ja bereits
durch die Webapplikation erfolgen muss.
Die Userauthentication seitens der Datenbank ist erst dann nötig,
wenn die Benutzer direkten Zugriff auf die Datenbank haben, bzw. du
umbedingt ausschliessen musst, dass der User X auf die Tabelle Y
zugreifen kann (und du sogar deinem eigenen Programm kein Vertrauen
entgegen bringen kannst/willst).
Viele Grüsse
Philipp