Halihallo Thomas
Überprüfung, ob user sich eingelogt hat:
if (!$_POST['login'] || $_POST['login'] != "yes")
if (!isset($_POST['login']) || $_POST['login']!="yes") {...}
true -> weiterleitung zum Login
false -> eingeloggt
NOK. Passwort soll auch überprüft werden, falls 'login' stimmt.
Weitergabe des Logzustands mithilfe eines Formulars und eines versteckten Feldes
<form name="form" method="POST">
<input type="hidden" name="login" value="yes">
</form>
NOK. Wie ich es vermutet habe, das ist katastrophal!
Du musst *umbedingt* login *und* passwort übergeben! - Ansonsten muss
ein Angreifer nur den Login erraten und das ist nicht sehr schwierig.
Fazit: Entweder du übergibst jedesmal login *und* passwort, oder du
überprüfst beim Login auf login/passwort und generierst eine Session
(http://www.php.net/session). Diese wird über eine SessionId
und SessionKey "authentifiziert" und stellt somit eine genauso
sichere Variante, wie login/passwort dar (mit dem zusätzlichen
Mehrwert, dass weder Login noch Passwort nach erfolgreichem Login
übertragen werden müssen).
Mit "unsinnigen Werten" meine ich, daß ich natürlich nicht "login" und "yes" verwendet habe, sondern stattdessen "quark1" und "segrjhdgasf". Die mit POST gesendeten Werte können natürlich ganz einfach manipuliert werden, wenn man aber nicht weiß, was man setzen muß funktioniert das auch nicht.
Aha, also doch gut? - Wichtig ist, dass du mit diesen unsinnigen
Werten einen User eindeutig feststellen kannst und weisst, dass sich
dieser mindestens einmal mit gültigem login/passwort eingeloggt hat.
Weil du so fragst: Wenn dies unsicher ist, kennst du eine sicherere Variante?
Ich persönlich halte eine Authentifizierung über Sessions für
durchaus sicher (gleich sicher, wie der Vorschlag von dir, wenn er
denn sicher umgesetzt ist).
Der Kunde loggt einmal in das System ein, stimmt sein Login/Passwort
wird eine Session eröffnet, welche künftig über SessionId und
SessionKey erkannt wird (und somit implizit auch die
Kundenauthentizität gegeben ist). Falls also eine Session empfangen
wird ($_SESSION), weisst du, dass der Benutzer sich eingeloggt haben
muss (fast! - Siehe unten!). Zumindest der Benutzerlogin muss
natürlich in dieser Session gespeichert werden, sodass du auch
weisst, _wer_ genau sich eingeloggt hat.
Ob dies jedoch sicher ist, hängt immer noch massgeblich von deiner
Programmierung ab, denn es bringt nichts, wenn du z.B. anderswo einen
Sessionmechanismus verwendest und dort Werte aus $_GET oder $_POST
speicherst (dann könnte ein Cracker sich 'login' über diese andere
Seite in die Session schreiben lassen und sich somit Zugang auch ohne
Passwort verschaffen). Es empfiehlt sich also, Login *und* Passwort
in der Session zu speichern, und diese auch bei jedem Zugriff erneut
zu überprüfen! - Ob eine Session existiert, oder ein 'login' darin
geschrieben ist, lässt nicht auf korrekte Authentifizierung eines
Kunden schliessen; dies ist erst mit einer stets erneuten Prüfung
von Login/Passwort (sicher) möglich.
Viele Grüsse
Philipp
The only program that runs perfectly every time, is a virus.