Wie kann ich Grund HTTP-Authentifizierung in PHP verwenden?
Frage
Ich versuche, Basis HTTP-Authentifizierung und folgte dem Beispiel auf der PHP-Handbuch Seite. Aber es für mich nicht funktioniert. Die Variable $_SERVER['PHP_AUTH_USER']
scheint nicht eingestellt werden. Wenn ein Benutzer versuchen, mich anzumelden, wird der Benutzer whith einen neuen Login-Dialog aufgefordert. Der Server läuft PHP 5.3.3 und ich habe versucht, mit Google Chrome und Internet Explorer.
Hier ist das einfache Beispiel, dass ich verwendet:
<?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 mit Basic-HTTP-Authentifizierung in PHP?
Lösung
Wie laufen PHP zu werden? Wenn es durch Apache mod_cgi ist, ich fürchte, Sie nicht halten, die Authentifizierungsinformationen überhaupt bekommen. Apache wird Geben Sie es nicht an CGI-Anwendungen, wenn Sie es mit dem SECURITY_HOLE_PASS_AUTHORIZATION
Flag kompilieren. (Ob es tatsächlich eine Sicherheitslücke oder nicht, hängt davon ab, ob andere Benutzer auf Ihrem Server ein geringeres oder größeres Privileg als Ihre Website-Nutzer).
Wenn es IIS CGI, müssen Sie sicherstellen, dass nur ‚Anonymous‘ Verzeichniszugriff konfiguriert ist, oder IIS wird auf Schritt versuchen, in und beglaubigen Credentials selbst.
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
HTML-Injektion Sicherheitsloch (gut, wenn es funktioniert). Verwenden htmlspecialchars()
. Man, ist, dass PHP doc Seite voll von höchst fragwürdig Beratung und Code.
Sie können zu sehen versuchen, auch bei $_SERVER['HTTP_AUTHORIZATION']
, obwohl ich es ist die mod_cgi Problem in diesem Fall keine der beiden Variablen vermuten, wird anwesend sein und Sie werden stattdessen Cookie-basierten Login zurückgreifen müssen. Oder Wechsel zu einem Host mit einem moderneren Ansatz für PHP-Hosting, wie FastCGI oder mod_php.
Andere Tipps
Versuchen Sie, diese ::
<?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");
}
?>
Für PHP-CGI:
in .htaccess hinzufügen:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>
und am Anfang des Skripts fügen Sie diese:
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Ich denke, die PHP-Methoden beruhen auf Standardauthentifizierung auf dem Webserver konfiguriert werden. Eine einfache Möglichkeit, dies zu tun, ist eine .htaccess-Datei im Verzeichnis enthalten Sie die Standardauthentifizierung für aktivieren möchten.
Die meisten Unix-basierten Web-Hosts können Sie dies tun, indem Sie einfach diese Datei hochzuladen. Eine separate Datei (diese .htauth nennen) die Benutzer-Logins halten, dass die Website oder das Verzeichnis zugreifen dürfen.
Überprüfen Sie, ob Sie Ihre Variable $_SERVER[‘PHP_AUTH_USER’]
and$_SERVER[‘PHP_AUTH_PW’]
vor Ort haben, wo overrided Sie versuchen, die beide Variablen zugreifen zu können.
Wenn oben nicht der Fall ist, dann Chek, wenn Sie PHP als CGI-mod verwenden oder nicht. Wenn Sie PHP verwenden als cgi dann in den meisten Casemod werden Sie nicht $_SERVER[‘PHP_AUTH_USER’]
and$_SERVER[‘PHP_AUTH_PW’]
bekommen, weil generraly haben wir nicht die Apache mit Option SECURITY_HOLE_PASS_AUTHORIZATION
kompilieren
Also, wenn Sie beide Variable erhalten möchten dann neu kompilieren Apache mit Option SECURITY_HOLE_PASS_AUTHORIZATION oder können Sie .htaccess Ansatz verwenden, erklärt in PHP Grund auth Post.