SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=296&group=52&page=2
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


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 sendet 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« kennengelernt 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 sogenannte .htaccess-Datei zu schützen. Eine solche Datei sieht wie folgt aus:

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 auf eigene Dateien anwenden.

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


Anpassen der Passwortdatei

Die Webserver-Identifizierung hat einen wesentlichen Nachteil: Sie müssen den Anwender nicht nur für die jeweilige Webanwendung registrieren, sondern auch beim Webserver. Eine Passwortänderung muss dem Server ebenfalls mitgeteilt werden.

Natürlich können Sie jederzeit den Serveradministrator darum bitten, die Anpassungen vorzunehmen, doch ich will Ihnen eine Lösung vorstellen, mit der es einfach ist, 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 mithilfe von PHP auch selbst erzeugen bzw. anfügen, und zwar mit der Funktion setze_passwort():

<?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 Benutzer 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";
    }
  }

  // Benutzer 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;
  }
}

?>
{PSP}Ich empfehle 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 Benutzers (Anwenders)

<?php

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

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

?>

Die Funktion selbst ist in der Lage,

Sie erhält den Dateinamen, den Benutzernamen und das Passwort. Sollte das Passwort nicht vorhanden bzw. leer sein, wird der betreffende Benutzer aus der Datei entfernt. Sie ist in der Lage, die Passwortdatei zu erzeugen oder eine vorhandene zu öffnen. Sollte die Passwortdatei vorhanden sein, wird sie nach entsprechenden Benutzernamen durchsucht. Sollte der Benutzername vorhanden sein, wird dessen Passwort entweder ersetzt oder, wenn das Passwort, welches im Argument $nutzer_pwd festgelegt wird, leer sein sollte, der Benutzer aus der Datei entfernt. Wird kein Benutzer 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(). Sie erhält das Passwort im Klartext übergeben und als Schlüsselbasis wird der dritte und zweite Buchstabe des Benutzernamens verwendet. Das so erzeugte Passwort wird dem String hinzugefügt, welcher sich aus Benutzername und verschlüsseltem Passwort zusammensetzt und in der Variablen $neu_pwd liegt. Anschließend 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 haben, Änderungen an der Datei vorzunehmen. Daher sollten Sie vorab klären, ob dem so ist.