HTTP-Authentifizierung
jj
- php
0 Didi4 Christian Seiler0 jj0 Christian Seiler0 jj
Hi Leute,
ich erlerne gerade PHP. In dem Lehrbuch bin ich an der HTTP-Authentifikation angekommen:
<?php
//Benutzername und Passwort für die Authentifizierung
$benutzername = 'rock';
$passwort = 'roll';
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
($_SERVER['PHP_AUTH_USER'] != $benutzername) || ($_SERVER['PHP_AUTH_PW'] != $passwort)) {
// Zugangsdaten falsch, Authenfizizierungs-Header senden
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Guitar Wars"');
exit('<h2>Guitar Wars</h2>Tut uns wirklich Leid, aber auf diese Seite können ' .
'Sie nur mit den richtigen Zugangsdaten zugreifen.');
}
?>
Der Quelltext ist original aus dem Buch. Wenn ich es aber auf meiner Website teste, kann ich den Benutzernamen und -passwort so oft eingeben wie ich will. Immer wieder erscheint die Eingabeaufforderung.
Help
Vielen Dank für eure Zeit!
Allgemeiner Tipp: Wenn eine Bedingung, so wie hier, nicht so tut, wie sie tun soll, obwohl sie es eigentlich tun müsste, dann ist es immer hilfreich, die beteiligten Variablen zur Kontrolle auszugeben. Ändere deinen Code wie folgt:
<?php
//Benutzername und Passwort für die Authentifizierung
$benutzername = 'rock';
$passwort = 'roll';
var_dump($_SERVER['PHP_AUTH_USER']);
var_dump($_SERVER['PHP_AUTH_PW']);
die();
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
($_SERVER['PHP_AUTH_USER'] != $benutzername) || ($_SERVER['PHP_AUTH_PW'] != $passwort)) {
// Zugangsdaten falsch, Authenfizizierungs-Header senden
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Guitar Wars"');
exit('<h2>Guitar Wars</h2>Tut uns wirklich Leid, aber auf diese Seite können ' .
'Sie nur mit den richtigen Zugangsdaten zugreifen.');
}
?>
Ausgabe:
NULL NULL
Eingabe des Worts und Zahl in die Aufforderung hat nicht funktioniert. (Ist wahrscheinlich klar (: ).
Ausgabe:
NULL NULL
Dann schau mal mit
phpinfo(INFO_VARIABLES);
nach, was da überhaupt gesetzt wird. Am Ende hast du noch eine uralte PHP-Version laufen, die diese Variablen gar nicht kennt.
kk,
die Variablen tauchen wirklich nicht auf.
PHP Version 5.2.11-0.dotdeb.0
Hallo,
die Variablen tauchen wirklich nicht auf.
PHP Version 5.2.11-0.dotdeb.0
Zitat aus http://php.net/manual/en/features.http-auth.php:
HTTP authentication with PHP
The HTTP Authentication hooks in PHP are only available when it is running as an Apache module and is hence not available in the CGI version.
Zitat aus http://php.net/manual/en/reserved.variables.server.php:
'PHP_AUTH_USER'
When running under Apache or IIS (ISAPI on PHP 5) as module doing HTTP authentication this variable is set to the username provided by the user.
Zitat aus Christians Beitrag von gestern:
Wenn Du PHP als FastCGI oder CGI mit dem Apache-Webserver betreibst, dann funktioniert das nicht, weil der Apache-Server den Authorization-Header nicht an PHP durchreicht.
Was brauchst du denn noch? Offensichtlich läuft PHP bei deinem Hoster als CGI, was du mit phpinfo() leicht verifizieren kannst.
Ergo: Es geht nicht, du kommst an die Credentials nicht ran.
So long,
Martin
Hallo,
Der Quelltext ist original aus dem Buch. Wenn ich es aber auf meiner Website teste, kann ich den Benutzernamen und -passwort so oft eingeben wie ich will. Immer wieder erscheint die Eingabeaufforderung.
Wenn Du PHP als FastCGI oder CGI mit dem Apache-Webserver betreibst, dann funktioniert das nicht, weil der Apache-Server den Authorization-Header nicht an PHP durchreicht.
Beide FastCGI-Module für den Apache bieten an, dies manuell noch nachträglich zu tun, beide machen das aber auf die gleiche Weise falsch (mod_fcgid wird es aber ab 2.3.6 aber richtig machen), weswegen das auch bei PHP nicht richtig ankommt.
Zur Konfiguration:
Wenn mod_fastcgi verwendet wird: Dann kann man in der zentralen Serverkonfiguration (.htaccess geht da leider nicht!) folgendes eintragen:
FastCgiConfig -pass-header Authorization
Wenn mod_fcgid verwendet wird, dann kann man in der zentralen Serverkonfiguration (.htaccess geht auch hier nicht) folgendes eintragen:
alt (bis mod_fcgid 2.2): PassHeader Authorization
neu (ab mod_fcgid 2.3): FcgidPassHeader Authorization
Wenn diese Konfiguration aktiviert ist (und *NUR* dann), dann kannst Du folgenden Code an den Anfang Deines PHP-Scripts tun, der diese Informationen dann extrahiert:
/* PHP_AUTH_USER/PHP_AUTH_PW setzen wenn mod_fastcgi/mod_fcgid mit passheader verwendet wird */
if (isset($_SERVER['Authorization'])) {
$auth = preg_split('/\s+/', trim($_SERVER['Authorization']));
if (strtolower($auth[0]) == 'basic' && count($auth) >= 2) {
$data = explode(":", base64_decode($auth[1]));
if (count($data) >= 2) {
$_SERVER['PHP_AUTH_USER'] = array_shift($data);
$_SERVER['PHP_AUTH_PW'] = join(':', $data);
}
}
}
Wenn Du keine Möglichkeit hast, die zentrale Serverkonfiguration zu ändern, dann nützt Dir der obige PHP-Code natürlich nichts (außer Dein Hoster hat sie zufälligerweise schon "richtig" gesetzt). Wenn PHP als CGI und nicht als FastCGI läuft, kannst Du auch nichts ändern und kannst ebenso keine HTTP-Authentifizierung nutzen.
(Alternativ kann man natürlich den kompletten Apache-Server mit einem speziellen Compilerflag kompilieren, welches Apache auch bei CGI/FastCGI den Authorization-Header durchreichen lässt. Aber das wäre ein noch gravierenderer Eingriff, als bloß die Serverkonfiguration zu ändern.)
(Weitere Alternativen sind natürlich die Verwendung von PHP als CGI/FastCGI iVm. einem anderen Webserver wie lighttpd oder nginx odre die Verwendung des Apache-Moduls mod_php, um PHP einzubinden.)
Viele Grüße,
Christian
sry, dein Post war bisher nicht zu sehen Christian.
Hab nachgeschaut. Verwendet wird CGI/FastCGI.
Nur habe ich noch keine Möglichkeit gefunden auf die Config-Datein zuzugreifen. Muss das der Provider machen? (Leider müsst ihr euch mit einem Neuling herumschlagen (: )
thx schonmal didi & Christian
Hallo,
Hab nachgeschaut. Verwendet wird CGI/FastCGI.
Was denn nun?
CGI: Keine Chance ohne Apache neu zu kompilieren oder auf eine andere PHP-Einbindung umzusteigen. Wird Dein Provider sicher nicht wollen. ;-)
FastCGI: Es gibt die Möglichkeit, Konfigurationsdateien zu bearbeiten und dann mit etwas zusätzlichem PHP-Code (hatte ich gepostet) das ganze zum Laufen zu bringen.
Nur habe ich noch keine Möglichkeit gefunden auf die Config-Datein zuzugreifen. Muss das der Provider machen?
Außer der Provider bietet an, dass Du die Konfigurationsdatei selbst bearbeiten kannst (*extrem* unwahrscheinlich): Ja, muss er.
Viele Grüße,
Christian
Heureka! (:
Vielen Dank Christian
Vielen Dank didi
Vielen Dank Martin