Teil von  SELFPHP   Teil von  Praxisbuch  Teil von  Sicherheit
Letztes Update: 16.08.2005 17:53:45


Navigation

Seite News *

Seite Startseite
Seite Über SELFPHP
Seite Werbung
Seite Kontakt
Seite Forum *
Seite Download *
Seite SELFPHP Banner *
Seite SELFPHP in Buchform
Seite Newsletter *
Seite Impressum

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  

 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 79.000 Beiträgen finden Sie sicher die passende Antwort!  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 



 

Session basierte Authentifizierung




Eine weitere Möglichkeit der Authentifizierung besteht darin, die Zugangsdaten eines Anwenders auszuwerten und diese in einer Session zu registrieren. Sie sollten bei der Übertragung mit Hilfe eines HTML-Formulars berücksichtigen, dass das Passwort im Klartext übertragen wird und daher die POST-Methode eingesetzt werden sollte. Sie könnten zusätzlich Clientseitig das Passwort mit Hilfe von JavaScript verschlüsseln, diese setzt jedoch voraus das beim Anwender die Ausführung von JavaScript zugelassen ist.

Um das folgende Beispiel, so flexibel, wie möglich zu gestalten, sollten Sie dafür sorgen, dass die Nutzeridentifizierung in eine externe Datei ausgelagert wird. Wir haben hierfür die Datei check.php angelegt. In dieser befindet sich folgende Funktion:



<?php

// Nutzeridenifikations-Funktion
function check_nutzer($pwddatei=".htpasswd") {
 
session_start();
 
 if (isset(
$_SESSION["versuch"]) && $_SESSION["versuch"]>2) {
    return 
false;
 }

 if (!isset(
$_SESSION["auth"]) && !isset($_POST["username"])) {
    return 
false;
 }

 if (isset(
$_POST["username"])) {
    if (!isset(
$_SESSION["versuch"])) {
     
$_SESSION["versuch"]=1;
    } else {
     
$_SESSION["versuch"]++;
    }

    if (!isset(
$_COOKIE[session_name()])) {
     return 
false;
    }

    
$nutzer trim($_POST["username"]);
    
$pwd  trim($_POST["passwort"]);

    if (
strlen($nutzer)<3) {
     return 
false;    
    }
    
    
$pwd=$nutzer.":".crypt($pwd,$nutzer[2].$nutzer[1])."\n";
    
$pwd_liste=file($pwddatei);
    
    if (
array_search($pwd,$pwd_liste)!== false) {
     
$_SESSION["auth"]=$nutzer;
     return 
true;
    } else {
     return 
false;
    }
 }
 
 if (isset(
$_GET["logout"])) {
    
session_destroy();
    
session_unset();
    unset(
$_SESSION);
    return 
false;
 } else {
     return 
true;
 }
}

?>



Die Datei welche die Eingabemaske samt Funktionsaufruf enthält, wird als login.php angelegt:


<?php

include("check.php");
if (!
check_nutzer()) {
    
?>

<html>
<head>
<title>Eingang</title>
</head>
<body>
<h1>Login</h1>
<form method="post" action="<?php echo $PHP_SELF ?>">
  <p>Nutzer:
    <input type="text" name="username">
  </p>
  <p>Passwort:
    <input type="password" name="passwort">
  </p>
  <p>
    <input type="submit" name="Submit" value="Login">
  </p>
</form>

<?php

if (isset($_SESSION["versuch"]) && $_SESSION["versuch"] < 3) {
 echo 
"Login nicht erfolgreich!
 Es stehen Ihnen noch "
.
 (
3-$_SESSION["versuch"]) .
 
" Versuche zur Verfügung!";
} else if (
$_SESSION["versuch"] == 3) {
 echo 
"Es stehen Ihnen keine
 weiteren Versuche zur Verfügung!"
;
}

?>

</body>
</html>

<?php

} else {
    
?>

<html>
<head>
<title>Private Zone</title>
</head>
<body>
<h1>Herzlich Willokmmen</h1>
<a href="<?php echo $PHP_SELF ?>?logout=1">Logout</a>
</body>
</html>

<?php

}

?>



Wie Sie anhand des ersten Arguments $pwddatei der Funktion erkennen können, verwenden wir in diesem Fall die mit Hilfe der setze_passwort()-Funktion erzeugte Passwortdatei um die Authentifizierung durchzuführen. Es steht Ihnen natürlich frei der Passwortdatei einen beliebigen Namen zu zuweisen, achten Sie lediglich darauf das sich jeder Nutzereintrage aus einem Nutzernamen und einem verschlüsselten Passwort zusammensetzt. Die Funktion selbst sorgt dafür, dass die benötigte Session initialisiert wird und prüft, ob ein Anwender angemeldet ist oder nicht. Gegebenfalls wird der Anwender identifiziert bzw. abgemeldet. Ist ein Anwender angemeldet oder war seine Anmeldung erfolgreich, gibt die Funktion true zurück, andernfalls false. Mit Hilfe der Rückgabewerte können Sie somit entscheiden, was bei einem erfolgreichen bzw. nicht erfolgreichen Login geschehen soll. Die Funktion ist zusätzlich in der Lage zu erkennen, wie oft versucht wurde sich einzuloggen. Dem Anwender stehen drei Versuche zur Verfügung. Nach drei Versuchen, welche in der Sessionvariable $_SESSION["versuch"] gespeichert sind, wird die Funktion grundsätzlich den Rückgabewert false liefern. Dies gilt auch in dem Fall, wenn weder die Sessionvariable $_SESSION["auth"] noch die Postvariable $_POST["username"] existieren. In diesem Fall wird davon ausgegangen, dass der Anwender noch keinen Loginversuch unternommen hat. Sobald der Anwender das Loginformular abgeschickt hat, beginnt der Authentifizierungsprozess. Die Sessionvariable $_SESSION["versuch"] wird in der Session registriert bzw. um den Wert 1 erhöht. Anschliessend wird überprüft, ob die Session durch ein Cookie übergeben wurde. Sollte dieses nicht existieren, wird die Funktion abgebrochen und false zurückgegeben. Der Nutzernamen und das Passwort werden in den Variablen $nutzer und $pwd gespeichert. Dabei werden mit Hilfe der Funktion trim() eventuell vorhandene Leerzeichen vor und nach dem Nutzernamen und Passwort entfernt. Eine weitere Bedingung, welche es zu berücksichtigen gilt ist die Tatsache, dass der Nutzername nicht kürzer als drei Zeichen sein darf. Damit ein identischer Eintrag in der Passwortdatei gefunden werden kann, wird ein String gebildet, welcher genauso aufgebaut ist wie eine Zeile in der Passwortdatei. Anschliessend wird der Inhalt dieser Datei mit Hilfe der Funktion file() in das Array $pwd_liste einglesen. Dieses Array wird mit Hilfe der Funktion array_search() durchsucht. Ist der Rückgabewert der Suche ungleich false, so bedeutet dies, der Anwender ist in der Passwortdatei enthalten und hat sich mit dem richtigen Passwort angemeldet. Die Sessionvariable $_SESSION["auth"] wird angelegt und in ihr der Nutzername gespeichert. Die Funktion liefert dann noch den Wert true zurück. Sollte der Anwender bereits angemeldet sein, wird geprüft, ob in der URL der Parameter logout enthalten ist. Ist dies der Fall, wird die Session beendet und die Funktion gibt false zurück, andernfalls true.


Session-Variante

Wir haben Ihnen noch eine weitere Variante angefügt, so dass Sie selbst entscheiden können, welche von beiden Lösungen Ihnen zusagt. Bei der folgenden Variante handelt es sich um eine Umsetzung, die ohne eine externe Passwortdatei auskommt.

Sie basiert auf insgesamt drei Dateien:
. login.php - enthält die Eingabemaske samt Authentifizierungsfunktion.
. gruss.php - auf diese Seite gelangt der Anwender nach dem Login
. logout.php - Hier wird der Anwender ausgeloggt und verabschiedet.


Beispiel - login.php



<?

session_start
();

function 
check_auth($nutzer,$pwd) {
    
$nutzer_liste = array ("matthias" => "mad",
                    
"caroline" => "car");
    if (isset(
$nutzer_liste[$nutzer]) && ($nutzer_liste[$nutzer] == $pwd)) {
        return 
true;
    } else {
        return 
false;
    }
}

$geheim_wort 'geheim';

unset(
$_POST["$username"]);

if (
$_SESSION['login']) {
    list(
$s_username$session_hash) = explode(',',$_SESSION['login']);
    if (
md5($s_username.$geheim_wort) == $session_hash) {
        
$_POST["$username"] = $s_username;
    } else {
        echo 
"Sie haben an ihrer Session rumgesaut!";
    }
}

if (
$_POST["$username"]) {
    
header('Location: gruss.php');
} else {
if (
check_auth($_POST['username'], $_POST['passwort'])) {
    
session_start();    
    
$_SESSION['login'] = $_POST['username'].','.md5($_POST['username'].$geheim_wort);
    echo 
"Sie sind eingeloggt!";
    echo 
"<p><a href='gruss.php'>Weiter</a>";
} else {
echo <<<Login
<form method="post" action="login.php"
Benutzername:<br>
Nutzer:
<input type="text" name="username"><br>
Passwort:
<input type="text" name="passwort"><br>
<input type="submit" value="Login">
</form>
Login;
}
}

?>





Beispiel - gruss.php



<?

session_start
();

$geheim_wort 'geheim';

unset(
$_POST["$username"]);

if (
$_SESSION['login']) {
    list(
$s_username$session_hash) = explode(',',$_SESSION['login']);
    if (
md5($s_username.$geheim_wort) == $session_hash) {
        
$_POST["$username"] = $s_username;
    } else {
        echo 
"Sie besitzen keine gültige Session!";
    }
}

if (
$_POST["$username"]) {
    echo 
"Guten Tag " $_POST["$username"];
    echo 
"<a href='logout.php'>Ausloggen</a>";
} else {
    echo 
"Guten Tag, anonymer Besucher!";
}

?>




Beispiel - logout.php



<?

session_start
();

$geheim_wort 'geheim';

unset(
$_POST["$username"]);

if (
$_SESSION['login']) {
    list(
$s_username$session_hash) = explode(',',$_SESSION['login']);
    if (
md5($s_username.$geheim_wort) == $session_hash) {
        
$_POST["$username"] = $s_username;
    } else {
        echo 
"Sie besitzen keine gültige Session!";
    }
}

if (
$_POST["$username"]) {
    unset(
$_SESSION['login'],$login);
    echo 
"Bis bald "$_POST["$username"];
    echo 
"<br><a href='login.php'>Login</a>";
} else {
    echo 
"Fehler beim Ausloggen!";
}

?>




 


HTTP-Authentifizierung via HTACCESS
 




 sponsored by

Host Europe


HighText iBusiness


Host Europe




© 2001-2006 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt
© 2005-2006 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de