HTTP Auth mit PHP header() nutzen

S

sevY

Hi zusammen,

es geht um HTTP Auth (kennt jeder – die Browsereingabeaufforderung mit Benutzernamen, Passwort – „umgangssprachlich“ fälschlichweise auch als .htaccess Schutz bezeichnet wird).

Man kann sich über HTTP Auth auch authentifizieren, indem man den Benutzernamen mit einem Doppelpunkt vom Passwort trennt und dieses mit einem @ der URL voranstellt.

Beispiel:

http://benutzer:passwort@www.sichere-seite.de/

Nun habe ich ein Tool gebastelt, mit dem man verschiedenen Benutzer- und Gruppenzugriffsrechte erstellen und auf verschiedene Verzeichnisse legen kann (.htaccess und .htpasswd Dateien werden dezentralisiert in die Verzeichnisse gelegt).
Aufgrund diverser Umstände (Performancegründe, da sehr viele Zugriffe - kein PHP für bestimmte Verzeichnisse gewünscht) blieb HTTP Auth als einzige Möglichkeit zur Authentifizierung übrig.

Und nun ein ganz banales Problem… der IE6 unter Windows scheint sich an dem URL-String mit „benutzer:passwort“ zu stören, sofern man diesen über PHP mit header() übergibt.
Safari und Firefox (auch unter Windows) verarbeiten das wunderbar – der IE6 quittiert das mit einem 404.

Warum die Übergabe mit header()? Ganz einfach… es gibt 6 Loginbereiche - aber es soll nur eine zentrale Loginseite mit schickem Loginformular geben…

Hier das Script, an das die Formulardaten via POST gesendet werden…

PHP:
$query=mysql_query("select realm from ".DB_TAB." where username='".mysql_escape_string($_POST['username'])."' order by username asc",$handler);
if(mysql_num_rows($query)>0) {

    $result=mysql_fetch_array($query);
    
    switch($result['realm']) {
    
        case MEMBER_DE:
            $target=''.mysql_escape_string($_POST['username']).':'.mysql_escape_string($_POST['password']).'@www.domain.com/member/';
        break;
        case MEMBER_EN:
            $target=''.mysql_escape_string($_POST['username']).':'.mysql_escape_string($_POST['password']).'@www. domain.com/en/member/';
        break;
        case PRESS_DE:
            $target=''.mysql_escape_string($_POST['username']).':'.mysql_escape_string($_POST['password']).'@www. domain.com/press/';
        break;
        case PRESS_EN:
            $target=''.mysql_escape_string($_POST['username']).':'.mysql_escape_string($_POST['password']).'@www. domain.com/en/press/';
        break;
    
    
    }

    header("Location: http://".$target."");
} else {
    header("Location: http://www.domain.com/04_login.php?error=".mysql_escape_string($_POST['username'])."");
}
?>


Lange Rede – kurzer Sinn: Wie übergibt man einen Benutzernamen und ein Passwort für HTTP Auth per Script so, das es alle Browser verstehen?


Viele Grüße
Yves
 
Yves schrieb:
Lange Rede – kurzer Sinn: Wie übergibt man einen Benutzernamen und ein Passwort für HTTP Auth per Script so, das es alle Browser verstehen?

Gar nicht. Microsoft hat das kaputt gemacht [tm], indem man auf die Sicherheitslücke so reagiert hat, dass man das URL-Schemata http://benutzer:passwort@domain.de einfach deaktiviert hat.

Matt
 
Zuletzt bearbeitet:
msslovi0 schrieb:
Gar nicht. Microsoft hat das kaputt gemacht [tm], indem man auf die Sicherheitslücke so reagiert hat, dass man das URL-Schemata http://benutzer:passwort@domain.de einfach deaktiviert hat.

Da wäre ich nicht so sicher, Du kannst das Auth-Schema ja auch im HTTP Header übergeben.

Dazu musst Du "user:password" als Base64 encodieren, und dann für das HTTP Header filed "Authorization" setzen.

Gruss

Alex
 
Und Wie Geht Das??

Da wäre ich nicht so sicher, Du kannst das Auth-Schema ja auch im HTTP Header übergeben.

Dazu musst Du "userassword" als Base64 encodieren, und dann für das HTTP Header filed "Authorization" setzen.

Gruss

Alex

Wie kann man das machen :rolleyes: ?? - Beispiel :)

Danke
 
das mit dem auth-header kenne ich nur so:
PHP:
<?php
$user="du"; $pw="geheimespasswort";

if(($_SERVER['PHP_AUTH_USER'] != $user) or ($_SERVER['PHP_AUTH_PW'] !=$pw)) 
{
 Header("WWW-Authenticate: Basic realm=\"hier kummst net rein\"");
 Header("HTTP/1.0 401 Unauthorized");
 exit;
} 
?>

warum wurde der alte trööt jetzt eigentlich wieder ausgegraben?
 
below schrieb:
Wo steckst Du denn fest?

Alex

Hallo,

das was 'Yves' am Anfang gepostet hat, ist genau das was ich möchte, und zwar eine Passwortgeschutzte Seite aufrufen ohne Benutzername und Passwort einzugeben. Dieser soll im Quellcode meines Admin-Bereiches mit übergeben werden. Hierzu gab es folgenden Link wo man Benutzername und Passwort mitsenden kann [http://benutzer:passwort@www.sichere-seite.de/]. Das ist im Grunde schon die Lösung allerdings funzt dies im IE nicht mehr da es ein Patch von MS gab welches dies verbietet. Nun suche ich nach einer Alternative wie ich z.Bsp. über den HEADER den Benutzernamen und Passwort mitschicken kann.

'Yves' schrieb auf deine Antwort->(Da wäre ich nicht so sicher, Du kannst das Auth-Schema ja auch im HTTP Header übergeben) hin

Yves schrieb:

Aus dem Ihnalt diese Links komme ich jedoch nicht klar.

Und auch das was 'moses_78' jetzt geschrieben hat (Codeschnippsel) ist ja nur ne Abfrage nachdem Benutzername und Passwort übergeben wurde.
 
Also so wie ich das jetzt auf die Schnelle verstehe musst Du nur folgendes ausführen:

header('Authorization: Basic '.base64_encode($_SERVER['PHP_AUTH_USER'].':'.$_SERVER['PHP_AUTH_PW']));

Und danach das header('Location:....');

Wie gesagt, habs nur überflogen, kann also ganz falsch sein.
 
Zurück
Oben Unten