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:
 



 

HTTP-Authentifizierung via HTACCESS




Die Authentifizierung über das HTTP-Protokoll ist sicher eine der bequemsten Möglichkeit einen Anwender zu einer Identifizierung zu veranlassen. Der Server bzw. das Skript senden einen HTTP-Header an den Browser, der zur Authentifizierung auffordert. Der Anwender erhält daraufhin vom Browser ein Loginfenster präsentiert, wie Sie es bereits im Abschnitt Authentifizierung via http kennen gelernt haben. Der Anwender loggt sich ein und erhält Zugriff auf den geschützten Bereich. Kann dieser nicht identifiziert werden, so wird der Zugriff verweigert und der Anwender erhält eine Fehlermeldung. Der Apache-Webserver ermöglicht es, ein Verzeichnis und sämtliche Unterverzeichnisse durch eine sog. .htaccess-Datei zu schützen. Eine solche Datei stellt sich, wie folgt dar:



AuthUserFile /htdocs/user/www.domain.de/admin/.htpasswd
AuthName Madania
AuthType Basic
<Limit GET>
require valid-user
</Limit>



Tipp: Unter UNIX sorgt der Punkt vor dem htaccess-Dateinamen dafür, dass diese Datei versteckt wird. Dies können Sie auch für eigene Dateien verwenden.


Hat sich ein Anwender über die Webserver-Authentifizierung angemeldet, si können Sie mit Hilfe der globalen Servervariablen $_SERVER["REMOTE_USER"] den Nutzernamen des angemeldeten Anwenders und mit $_SERVER["AUTH_TYPE"] die Authentifizierungsmethode ermitteln.


Anpassen der Passwortdatei

Die Webserver-Identifizierung besitzt einen wesentlichen Nachteil. Sie müssen den Anwender nicht nur für die jeweilige Web-Anwendung registrieren, sondern auch beim Webserver. Bei einer Passwortänderung muss dieses dem Server ebenfalls mitgeteilt werden.

Natürlich können Sie jederzeit den Serveradministrator darum bitten die Anpassungen vorzunehmen, doch wir wollen Ihnen eine Lösung vorstellen, die es Ihnen ermöglicht die Änderungen selbst vorzunehmen.

Ein Eintrag in einer gültigen Passwortdatei, welche in den Meisten Fällen den Dateinamen .htpasswd besitzt, setzt sich aus einer Zeile zusammen. Die Zeile stellt sich, wie folgt dar:

Nutzername:Passwort

Diese Zeile können Sie mit Hilfe von PHP auch selbst erzeugen bzw. anfügen. Wir haben hierfür eine Funktion setze_passwort(), welche wie folgt umgesetzt wurde:



<?php

// Passwort Funktion
function setze_passwort($pwddatei,$nutzer,$nutzer_pwd="") {
 if (empty(
$nutzer) || empty($pwddatei) || strlen($nutzer)<3) {
    return 
false;
 }
 
// Sollte die Datei existieren wird ein Backup
 // mit einem Zeitstempel erzeugt
 
if (file_exists($pwddatei)) {
  
$pwd=file($pwddatei);
  
copy("$pwddatei",$pwddatei.time());
 } else {
  
$pwd=array();
 }
 
// Neue Passwort Variable initialisieren
 
$neu_pwd="";

 
// Sämtliche Nutzer durchlaufen
 
foreach($pwd as $eintrag) {
    if (
strstr($eintrag,$nutzer.":")==$eintrag) {
        
$change_nutzer=true;
        if (empty(
$nutzer_pwd)) {
         continue;    
        }
        
$neu_pwd.= $nutzer.":".crypt($nutzer_pwd,$nutzer[2].$nutzer[1])."\n";
    } else {
        
$neu_pwd.=trim($eintrag)."\n";
    }
 }

 
// Nutzer neues Passwort zuweisen
 
if (!isset($change_nutzer)) {
    if (empty(
$nutzer_pwd)) {
     return 
false;    
    } else {
     
$neu_pwd.= $nutzer.":".crypt($nutzer_pwd,$nutzer[2].$nutzer[1])."\n";
    }
 }
 
 
// Daten sichern
 
$datei=fopen($pwddatei,"w");
 if (
is_resource($datei)) {
  
flock($datei,LOCK_EX);
  
fwrite($datei,$neu_pwd);
  
flock($datei,LOCK_UN);
  
fclose($datei);
  return 
true;
 } else {
  return 
false;
 }
}

?>



Wir empfehlen Ihnen die Funktion in eine Datei mit dem Namen phpcrypt.php abzulegen. So können Sie bei bedarf auf die Funktion zugreifen.


Beispiel - anlegen eines Nutzers (Anwenders)



<?php

// Funktion einbinden
include("phpcrypt.php");

// Zieldatei, Nutzer, Passwort
if (setze_passwort(".htpasswd","matthias","test")) {
    echo 
"Erfolgreich";
} else {
    echo 
"Fehlgeschlagen";
}

?>



Die Funktion selbst ist in der Lage:
. Ein Nutzerpasswort zu ändern
. Einen neuen Nutzer samt Passwort anzulegen
. Einen Nutzer samt Passwort zu löschen

Sie erhält den Dateinamen, den Benutzernamen und das Passwort übergeben. Sollte das Passwort nicht vorhanden sein bzw. leer, wird der betreffende Nutzer aus der Datei entfernt. Sie ist in der Lage die Passwortdatei zu erzeugen oder eine vorhandene zu öffnen. Sollte die Passwortdatei vorhanden sein wird diese nach entsprechenden Nutzernamen durchsucht. Sollte der Nutzername vorhanden sein, wird dessen Passwort entweder ersetzt oder wenn das Passwort, welches im Argument $nutzer_pwd festgelegt wird, leer sein sollte, der Nutzer aus der Datei entfernt. Wird kein Nutzer gefunden, wird ein neuer Eintrag in der Passwortdatei angelegt. Die jeweiligen Passwörter in der Passwortdatei müssen verschlüsselt abgelegt werden. Die Funktion die Ihnen bei der Verschlüsselung behilflich ist, ist crypt(). Diese erhält das Passwort im Klartext übergeben und als Schlüsselbasis wird der dritte und zweite Buchstabe des Nutzernamens verwendet. Das so erzeugte Passwort wird dem String hinzugefügt, welcher sich aus Nutzername und verschlüsseltem Passwort zusammensetzt und in der Variablen $neu_pwd liegt. Anschliessend wird die neu erzeugte Passwortdatei gespeichert. Da ein Eingriff in die Passwortdatei auch zu Problemen führen kann, sollte man an eine Sicherung der möglicherweise vorhandenen Passwortdatei denken. Daher wird bei jeder Anpassung der Passwortdatei, eine Kopie der Datei angelegt, sofern diese vorhanden ist. Sollten sämtliche Prozesse innerhalb der Funktion setze_passwort() fehlerfrei durchlaufen worden sein, wird diese true zurückliefern, andernfalls false.

Achtung: Es wird nicht geprüft, ob Sie bzw. das PHP-Skript das Recht hat Änderungen an der Datei vorzunehmen. Daher sollten Sie vorab klären ob dem so ist.



 


Sicherheit
 




 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