Ich stand vor folgendem Problem: In der Website eines Vereins sollte ein passwortgeschützter Bereich für die Mitglieder eingerichtet werden. Die Änderung des Passwortes sollte direkt im Frontend möglich sein, damit die URL des Backends nicht publiziert werden muss.
Ich habe mir folgendes kleine Modul gebastelt - ich möchte gerne Feedback einholen, da es erst etwa das dritte php-Skript ist, das ich je geschrieben habe. Mich interessiert vor allem, ob ich irgendwelche Sicherheitslücken übersehen habe.
Nachdem das Mitglied sich mit dem normalen Login-Modul eingewählt hat, kann er oder sie im Mitgliederbereich den Menüpunkt "Passwort ändern" anklicken. Anschliessend wird eine Seite mit folgendem Modul aufgerufen (Nur Output, kein Input):
Code: Alles auswählen
<?php
//Username gemäss Login ermitteln
$name_login=$auth->auth[uname];
if($sent!="1"){
//Formular zur Passwortänderung ausgeben
//mit zwei Eingabefeldern: Passwort und
//Bestätigung des Passworts
echo '<form action='.$auth->url().' method="POST"><input type="hidden" name="sent" value="1">';
echo '<TABLE border=0><TBODY><TR><TD width=150>Benutzername</TD><TD width=250>'.$name_login.'</TD></TR>';
echo '<tr><td>Neues Passwort</td><td><input name="passwort1" type="password" size="24" maxlength="24"></td></tr>';
echo '<tr><td>Neues Passwort wiederholen</td><td><input name="passwort2" type="password" size="24" maxlength="24"></td></tr>';
echo '<tr><td></td><td><INPUT type=submit value="Passwort ändern"></td></tr></TBODY></TABLE></form>';
}else{
// Es wird geprüft, ob neues Passwort
//und Bestätigung übereinstimmen
//Falls nicht, kann Benutzer wieder zum
//Formular zurückkehren
if($passwort1!=$passwort2){
$sent="0";
echo '<b><font color=#ff0000>Warnung: Passwort nicht geändert</font></b><br><br>Das neue Passwort und dessen Bestätigung stimmten nicht überein.<br><br>';
echo 'Bitte versuchen Sie es noch einmal: <a href='.$auth->url().'>Passwort ändern</a>';
}else{
//Es wird geprüft, ob überhaupt eine Eingabe erfolgte
//Wenn die Länge des Passworts 0 Zeichen ist, wird
//abgebrochen und der Benutzer kann zum
//Formular zurückkehren
//Man könnte hier auch eine Mindestlänge von x
//Zeichen erzwingen
$laenge = strlen($passwort1);
if($laenge == 0){
$sent="0";
echo '<b><font color=#ff0000>Warnung: Passwort nicht geändert</font></b><br><br>Sie haben kein neues Passwort eingegeben. Das bisherige Passwort bleibt weiterhin gültig.<br><br>';
echo 'Bitte versuchen Sie es noch einmal: <a href='.$auth->url().'>Passwort ändern</a>';
}else{
//md5 Wert des Passwortes berechnen und in Datenbank schreiben
$passwort_md5=md5($passwort1);
$db_login = new DB_Contenido;
$sql = "UPDATE ".$cfg['tab']['phplib_auth_user_md5']." SET password='".$passwort_md5."' WHERE username='".$name_login."'";
$db_login->query($sql);
echo 'Passwort erfolgreich geändert';
}}}
?>
Und trotzdem nagt in mir der Zweifel, ob ich nicht irgendeine kritische Sicherheitssache übersehen habe... zum Beispiel würde ich für den Mitgliederbereich gerne auf https wechseln, habe aber noch nicht rausgefunden, wie ich das auf triviale Weise regeln kann.
Danke für Feedback