wake-up-neo.com

Wie kann ich die grundlegende HTTP-Authentifizierung in PHP verwenden?

Ich versuche, Basic HTTP Authentication zu verwenden und folge dem Beispiel auf der Manpage PHP. Aber bei mir funktioniert es nicht. Die Variable $_SERVER['PHP_AUTH_USER'] scheint nicht gesetzt zu sein. Wenn ein Benutzer versucht, sich anzumelden, wird er mit einem neuen Anmeldedialog dazu aufgefordert. Auf dem Server wird PHP 5.3.3 ausgeführt, und ich habe es mit Google Chrome und Internet Explorer versucht.

Hier ist das einfache Beispiel, das ich verwendet habe:

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="Jonas Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'User pressed Cancel';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as you password.</p>";
}
?>

Was ist falsch? Wie kann ich die grundlegende HTTP-Authentifizierung in PHP verwenden?

11
Jonas

Wie wird PHP ausgeführt? Wenn es sich um Apache mod_cgi handelt, können Sie leider keine Authentifizierungsinformationen abrufen. Apache wird sie nicht an CGI-Apps weitergeben, wenn Sie sie nicht mit dem Flag SECURITY_HOLE_PASS_AUTHORIZATION kompilieren. (Ob es sich tatsächlich um eine Sicherheitslücke handelt oder nicht, hängt davon ab, ob andere Benutzer auf Ihrem Server ein niedrigeres oder höheres Privileg haben als die Benutzer Ihrer Website.)

Bei der CGI IIS müssen Sie sicherstellen, dass nur der anonyme Verzeichniszugriff konfiguriert ist oder IIS versucht, die Anmeldeinformationen selbst einzutragen und zu authentifizieren.

echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";

Sicherheitslücke bei HTML-Injection (gut, wenn es funktioniert). Verwenden Sie htmlspecialchars(). Mann, ist diese PHP Doc-Seite voller fragwürdiger Ratschläge und Codes.

Sie können auch versuchen, sich $_SERVER['HTTP_AUTHORIZATION'] anzusehen, obwohl ich vermute, dass es sich um das Problem mod_cgi handelt. In diesem Fall wird keine der Variablen vorhanden sein, und Sie müssen stattdessen auf das Cookie-basierte Login zurückgreifen. Oder wechseln Sie zu einem Host mit einem moderneren Ansatz für das PHP - Hosting, beispielsweise FastCGI oder mod_php.

8
bobince

Für PHP-CGI:

in .htaccess fügen Sie folgendes hinzu:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>

und fügen Sie am Anfang Ihres Skripts Folgendes hinzu:

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
8
Teddy

Versuche dies::

<?php
    /*
    ** Define a couple of functions for
    ** starting and ending an HTML document
    */
    function startPage()
    {
        print("<html>\n");
        print("<head>\n");
        print("<title>Listing 24-1</title>\n");
        print("</head>\n");
        print("<body>\n");
    }

    function endPage()
    {
        print("</body>\n");
        print("</html>\n");
    }
    /*
    ** test for username/password
    */
    if( ( isset($_SERVER['PHP_AUTH_USER'] ) && ( $_SERVER['PHP_AUTH_USER'] == "leon" ) ) AND
      ( isset($_SERVER['PHP_AUTH_PW'] ) && ( $_SERVER['PHP_AUTH_PW'] == "secret" )) )
    {
        startPage();

        print("You have logged in successfully!<br>\n");

        endPage();
    }
    else
    {
        //Send headers to cause a browser to request
        //username and password from user
        header("WWW-Authenticate: " .
            "Basic realm=\"Leon's Protected Area\"");
        header("HTTP/1.0 401 Unauthorized");

        //Show failure text, which browsers usually
        //show only after several failed attempts
        print("This page is protected by HTTP " .
            "Authentication.<br>\nUse <b>leon</b> " .
            "for the username, and <b>secret</b> " .
            "for the password.<br>\n");
    }
?>
7
Mazhar Ahmed

Ich denke, die PHP - Methoden setzen voraus, dass die Basisauthentifizierung auf dem Webserver konfiguriert ist. Eine einfache Möglichkeit, dies zu tun, besteht darin, eine .htaccess-Datei in das Verzeichnis aufzunehmen, für das die Standardauthentifizierung aktiviert werden soll.

Die meisten Unix-basierten Webhosts ermöglichen es Ihnen, diese Datei hochzuladen. Eine separate Datei (nennen Sie diese .htauth) enthält die Benutzeranmeldungen, die auf die Site oder das Verzeichnis zugreifen dürfen.

0
Ken Richards

Prüfen Sie, ob Sie Ihre Variable $_SERVER[‘PHP_AUTH_USER’] und$_SERVER[‘PHP_AUTH_PW’] vor dem Ort überschrieben haben, an dem Sie auf beide Variablen zugreifen möchten.

Wenn oben nicht der Fall ist, dann prüfen Sie, ob Sie PHP als CGI-Mod verwenden oder nicht. WENN Sie php als cgi mod verwenden, erhalten Sie in den meisten Fällen $_SERVER[‘PHP_AUTH_USER’] und$_SERVER[‘PHP_AUTH_PW’] nicht, da wir den Apache generell nicht mit der Option SECURITY_HOLE_PASS_AUTHORIZATION Kompilieren Option SECURITY_HOLE_PASS_AUTHORIZATION oder Sie können den .htaccess-Ansatz verwenden, der in PHP basic auth post erläutert wird.

0