zisslaweng.de

 Home    CSS    PHP    HTML    JavaScript    Allgemein    Sitemap   exemption-filter

Die Anmeldung

in diesem einfachen Beispiel zweistufig. Ein neuer User füllt ein einfaches Formular aus, in dem er einen Usernamen und eine gültige Mailadresse angibt. Das script speichert die Daten, generiert ein vorläufiges Passwort und sendet eine Mail. Mit den darin enthaltenen Daten ist dann ein Login möglich. Dann kann der neue User seine Daten vervollständigen und z.B. ein eigenes Passwort wählen.

Für eine reale Webseite ist diese Methode möglicherweise zu simpel. Denkbar wäre, dass Sie als Webmaster es sich vorbehalten, neue User freizuschalten.

Was bleibt, ist natürlich nur Ihnen (dem Webmaster) vorbehalten, nämlich dem User weitergehende Rechte einzuräumen.

 
Anmeldung Username:  Mail: 

Diese Seite ruft sich selbst wieder auf wenn der Abschicken Knopf betätigt wird. Das wird innerhalb des Form Tags geregelt und sieht so aus.

<form  name="user" action="<? $_SERVER['PHP_SELF'] ?>;"
method=post>;

Am Seitenanfang dann ein kleines script zum Erkennen, wurde der "Abschicken" Knopf betätigt. Alle Funktionen betreffend Userinput in der Datei z_user_inc.php in einer neuen Klasse User_Funkt(), die die Klasse UserDbMapper erweitert.

	if (isset($_POST['submit'])) {
	$U = new User_Funkt();
	$message = $U->anmelden();
	}
    Die Methoden zum
  • Anmelden,
  • Userdaten editieren,
  • Passwort vergessen
  • Mail versenden
  • sind relativ einfach, ich verzichte darauf, sie hier zu listen.

Die beiden Klassen UserDbMapper und User werden um einige einfache Methoden erweitert.

checkUser() prüft, ob ein User dieses Namens existiert, liefert aber auf jeden Fall ein User Objekt zurück. Mit Hilfe der Methode User->existUsername() dann die eigentliche Überprüfung. Und newUser() wird ein User Objekt übergeben und schreibt die Daten in die Datenbank, wobei das Passwort verschlüsselt wird.

Erweiterung Class UserDbMapper

...
public function checkUser ($user) {
  $sql  = "
  SELECT 
    * 
  FROM z_demo_login 
  WHERE user ='".$this->real_escape_string($user)."'
  ";
  $result = $this->base_query($sql);
  if ($result->num_rows >= 1) {
    return new User($result->fetch_assoc());
  } else {
    return new User();
  }
}

public function newUser($u) {
  $sql  = "
  INSERT INTO z_demo_login 
    (user, mail, password, rechte) 
  VALUES ('".$this->real_escape_string($u->user)."',
        '".$this->real_escape_string($u->mail)."',
        password ('$u->password'),
        'R')
  ";
  return $this->base_query($sql);
}
...

Erweiterung Class User

...
public function existUsername()
{ return ($this->daten['user'] != '' ? true : false ); }
...

Und damit tatsächlich alles vollständig ist, eine neue Datei  z_functions_inc.php5, in der kleine Funktionen gesammelt werden. In diesem Fall die Funktionen zufall(), die für den neuen User ein Passwort generiert.

function zufall() {
  $returnvalue = '';
  for ($i=0; $i < 6; $i++ ){
    $returnvalue .= chr(mt_rand(65,90));
  }
  return $returnvalue;
}

 Geben Sie bei Fehlermeldungen keine Informationen preis. Wenn Sie einem Hacker mitteilen "User existiert" (so wie ich das hier mache), dann ist für Ihn schon die halbe Arbeit getan. Er muss jetzt nur noch das zugehörige Passwort finden. Schwierig genug, aber...

Das Risiko kann man begrenzen. Wenn Sie bei jedem Loginversuch die IP-Adresse und das Datum protokollieren und vielleicht noch einen Zähler mitlaufen lassen, kann man die erlaubten Versuche für diese IP auf x-mal pro Tag begrenzen.

Hacker könnten auch versuchen, über Formularfelder irgendwelchen Code bei Ihnen einzuschleusen, z.B. in einen Gästebucheintrag. Je nach Anwendung: begrenzen Sie die zulässige Länge, entfernen Sie Tags, und.. und..

Diese Seite wäre durch die Offenlegung des Tabellennamens und der Felder ein ideales Angriffsziel für eine Attacke namens "SQL-Injection".

Die Länge des Usernamens auf 10 Zeichen begrenzt nach der Devise, nur so viel wie unbedingt notwendig, die Mailadresse ist auf Plausibilität geprüft und sollte keinen feindlichen Code enthalten können. Sicherheitshalber die Maskierung des Userinput durch die Funktion mysqli_real_escape_string() beim Schreiben in die Datenbank durch die Methode newUser(). Damit werden die Character "NUL (ASCII 0), \n, \r, \, ', ", und Control-Z" entwertet.

Die Character "%" und "_" haben in SQL "like" Abfragen die Funktion von Platzhaltern. Wie Sie die (und weitere) noch entwerten können lesen Sie bitte hier
Logo