HTTP-Authentifizierung mit PHP

Man kann die Funktion header() verwenden, um die Nachricht "Authentifizierung erforderlich" an den Client-Browser zu senden, damit dieser ein Fenster zur Eingabe von Benutzername/Passwort öffnet. Hat der Benutzer diese eingegeben, wird die URL des PHP-Skripts mit den vordefinierten Variablen PHP_AUTH_USER, PHP_AUTH_PW und AUTH_TYPE, die den Benutzernamen, das Passwort und den Typ der Authentifizierung enthalten, erneut aufgerufen. Diese vordefinierten Variablen befinden sich im Array $_SERVER. Es werden nur die Authentifizierungsmethoden "Basic" und "Digest" unterstützt. Näheres hierzu bei der Funktion header().

Ein Auszug aus einem Skript, das die Clientauthentifizierung auf einer Seite erzwingt, würde so aussehen:

Beispiel #1 Beispiel: Basic-HTTP-Authentifizierung

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    
header('WWW-Authenticate: Basic realm="My Realm"');
    
header('HTTP/1.0 401 Unauthorized');
    echo 
'Text, der gesendet wird, falls der Benutzer auf Abbrechen drückt';
    exit;
} else {
    echo 
"<p>Hallo {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo 
"<p>Sie gaben {$_SERVER['PHP_AUTH_PW']} als Passwort ein.</p>";
}
?>

Beispiel #2 Beispiel: Digest-HTTP-Authentifizierung

In diesem Beispiel wird gezeigt, wie ein einfaches Skript für die Digest-HTTP-Authentifizierung implementiert wird. Weitere Informationen dazu sind im » RFC 2617 zu finden.

<?php
$realm 
'Geschützter Bereich';

// Benutzer => Passwort
$benutzer = array('admin' => 'mypass''gast' => 'gast');

if (empty(
$_SERVER['PHP_AUTH_DIGEST'])) {
    
header('HTTP/1.1 401 Unauthorized');
    
header('WWW-Authenticate: Digest realm="' $realm .
           
'",qop="auth",nonce="' uniqid() . '",opaque="' md5($realm) . '"');

    die(
'Text, der gesendet wird, falls der Benutzer auf Abbrechen drückt');
}

// Analysieren der Variable PHP_AUTH_DIGEST
if (!($daten http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset(
$benutzer[$daten['username']]))
    die(
'Falsche Zugangsdaten!');

// Erzeugen einer gültigen Antwort
$A1 md5($daten['username'] . ':' $realm ':' $benutzer[$daten['username']]);
$A2 md5($_SERVER['REQUEST_METHOD'] . ':' $daten['uri']);
$gueltige_antwort md5($A1 ':' $daten['nonce'] . ':' $daten['nc'] .
                        
':' $daten['cnonce'] . ':' $daten['qop'] . ':' $A2);

if (
$daten['response'] != $gueltige_antwort)
    die(
'Falsche Zugangsdaten!');

// OK, gültige Benutzername & Passwort
echo 'Sie sind angemeldet als: ' $daten['username'];

// Funktion zum analysieren der HTTP-Auth-Header
function http_digest_parse($txt) {
    
// gegen fehlende Daten schützen
    
$noetige_teile = array('nonce'=>1'nc'=>1'cnonce'=>1'qop'=>1,
                           
'username'=>1'uri'=>1'response'=>1);
    
$daten = array();
    
$schluessel implode('|'array_keys($noetige_teile));

    
preg_match_all('@(' $schluessel ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@',
                   
$txt$trefferPREG_SET_ORDER);

    foreach (
$treffer as $t) {
        
$daten[$t[1]] = $t[3] ? $t[3] : $t[4];
        unset(
$noetige_teile[$t[1]]);
    }

    return 
$noetige_teile false $daten;
}
?>

Hinweis: Hinweis zur Kompatibilität

Achten Sie für die maximale Kompatibilität mit allen Clients bei den Header-Zeilen auf die richtige Schreibweise! Das Schlüsselwort "Basic" sollte genau so geschrieben werden, der Realm-String muss in doppelte (nicht einfache) Anführungszeichen gesetzt werden und in der HTTP/1.0 401-Zeile darf nur genau ein Leerzeichen vor dem 401-Code stehen. Wie im Beispiel oben zu sehen, müssen die Authentifizierungsparameter durch Kommata getrennt werden.

Anstatt PHP_AUTH_USER und PHP_AUTH_PW wie im Beispiel oben einfach nur auszugeben, werden Sie den Benutzernamen und das Passwort auf Gültigkeit überprüfen wollen. Dies kann durch das Abfragen einer Datenbank oder die Suche des Benutzers in einer Textdatei geschehen.

Vorsicht bei einigen Internet Explorer-Versionen - sie scheinen sehr wählerisch zu sein, was die Reihenfolge der Header angeht. Abhilfe schafft hier das Senden des WWW-Authenticate-Headers vor dem HTTP/1.0 401-Header.

Hinweis: Konfigurationshinweis

PHP prüft das Vorhandensein einer AuthType Apache-Direktive, um zu entscheiden, ob eine externe Authentifizierung aktiv ist.

Zu beachten ist, dass Obenstehendes keinesfalls jemanden, der auf demselben Server die Kontrolle über eine nicht authentifizierte URL hat, davon abhalten kann, Passwörter von authentifizierten URLs auszulesen.

Sowohl Netscape als auch der Internet Explorer löschen den lokalen Authentifizierungscache des Browserfensters, wenn der Server eine 401-Meldung zurückgibt. Dies kann verwendet werden, um einen Benutzer "auszuloggen" und eine erneute Eingabe des Benutzernamens/Passworts zu erzwingen. Manchmal wird dieses Verhalten für das automatische Ausloggen nach Ablauf einer bestimmten Zeitspanne oder für einen Logout-Button genutzt.

Beispiel #3 HTTP-Authentifizierung, mit erneuter Anforderung von Name/Passwort

<?php
function authentifizieren() {
    
header('WWW-Authenticate: Basic realm="Test Authentication System"');
    
header('HTTP/1.0 401 Unauthorized');
    echo 
"Bitte geben Sie eine gültige Login-ID und das Passwort für den
        Zugang ein\n"
;
    exit;
}

if (!isset(
$_SERVER['PHP_AUTH_USER']) ||
    (
$_POST['Gesehen'] == && $_POST['AlteAuth'] == $_SERVER['PHP_AUTH_USER'])) {
    
authentifizieren();
} else {
    echo 
"<p>Willkommen: " htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
    echo 
"Alt: " htmlspecialchars($_REQUEST['AlteAuth']);
    echo 
"<form action='' method='post'>\n";
    echo 
"<input type='hidden' name='Gesehen' value='1' />\n";
    echo 
"<input type='hidden' name='AlteAuth' value=\"" htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
    echo 
"<input type='submit' value='Erneut Anmelden' />\n";
    echo 
"</form></p>\n";
}
?>

Dieses Verhalten wird vom Authentifizierungsstandard HTTP Basic nicht gefordert, daher sollte man sich nie darauf verlassen. Tests mit Lynx haben gezeigt, dass Lynx die Authentifizierungsinformationen bei Erhalt einer 401-Meldung nicht löscht. Solange der benötigte Berechtigungsnachweis nicht geändert wird, kann der Benutzer auf die vorhergehende Seite zurück und danach vorwärts und die angeforderte Adresse wieder öffnen. Der Benutzer kann die Authentifizierungsinformationen aber durch Drücken von '_' löschen.

Damit die HTTP-Authentifizierung funktioniert, wenn der IIS mit der CGI-Version von PHP verwendet wird, müssen Sie die "Directory Security" Ihrer IIS-Konfiguration ändern. Klicken Sie auf "Edit" und aktivieren Sie nur "Anonymous Access". Alle anderen Felder sollten deaktiviert bleiben.

Hinweis: IIS-Anmerkung:
Damit die HTTP-Authentifizierung mit dem IIS funktioniert, muss die PHP-Konfigurationsanweisung cgi.rfc2616_headers auf 0 (die Voreinstellung) gesetzt sein.

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Was genau bedeutet "Vibe Coding"? Ein tiefgehender Blick für Entwickler

In der Welt der Softwareentwicklung gibt es unzählige Wege, wie man an ein Projekt herangeht. Manche schwören auf strikte Planung, andere auf bewährte Algorithmen und wieder andere lassen sich von etwas ganz anderem leiten: ihrem Gefühl. ...

admin

Autor : admin
Kategorie: Software & Web-Development

PHP cURL-Tutorial: Verwendung von cURL zum Durchführen von HTTP-Anfragen

cURL ist eine leistungsstarke PHP-Erweiterung, die es Ihnen ermöglicht, mit verschiedenen Servern über verschiedene Protokolle wie HTTP, HTTPS, FTP und mehr zu kommunizieren. ...

TheMax

Autor : TheMax
Kategorie: PHP-Tutorials

Midjourney Tutorial - Anleitung für Anfänger

Über Midjourney, dem Tool zur Erstellung digitaler Bilder mithilfe von künstlicher Intelligenz, gibt es ein informatives Video mit dem Titel "Midjourney Tutorial auf Deutsch - Anleitung für Anfänger" ...

Mike94

Autor : Mike94
Kategorie: KI Tutorials

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

SEO: Worauf sollte man sich konzentrieren?

Hier sind einige wichtige Aspekte, auf die man sich bei der Suchmaschinenoptimierung (SEO) konzentrieren sollte, sowie eine Analyse der Stärken d ...

Geschrieben von ruletaa am 11.04.2025 03:55:50
Forum: SEO - Suchmaschinen Tricks und Tipps
Google findet die Seite einfach nicht...

Sie können die folgenden Websites aufrufen, um Ihre SEO-bezogene Konfiguration zu verfeinern: Ruletaa (https://ruletaa.net) HixAI (https://hix.ai)

Geschrieben von ruletaa am 11.04.2025 03:48:33
Forum: SEO - Suchmaschinen Tricks und Tipps
Keine Moderation?

Ja, das ist echt schade. Shopware Freelancer (https://stefanpilz.ltd/)

Geschrieben von Stefan_Pilz am 10.04.2025 15:42:50
Forum: Fragen/Vorschläge zum Forum
Seltsames Verhalten von execute() oder Fehler meinerseits

The level of brilliance that you have displayed here is nothing short of astounding. Your performance has not even come close to meeting my expect ...

Geschrieben von sloperun3az am 09.04.2025 12:22:39
Forum: SQL / Datenbanken