2015-07-31 6 views
11

Wenn ein öffentlich zugängliches Verzeichnis eine einfache HTTP-Authentifizierung erfordert, wird normalerweise der Wert $_SERVER['HTTP_AUTHORIZATION'] und/oder $_SERVER['REMOTE_USER'] (oder $_SERVER['PHP_AUTH_USER'] usw.) festgelegt und zugänglich für PHP, sobald eine gültige Benutzername/Passwort-Kombination dem Server zur Verfügung gestellt wurde.

Zum Beispiel, wenn http://www.example.com/members grundlegende Authentifizierung erfordert, und ein Benutzer erfolgreich authentifiziert die Anmeldeinformationen mit myusername und mypassword durch manuelle http://myusername:[email protected]/members in ihren Browser eingeben, würde der Wert von $_SERVER['HTTP_AUTHORIZATION'] so etwas wie:

Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk 

.. . und der Wert von $_SERVER['REMOTE_USER'] würde einfach sein:

myusername 

jedoch, wenn die Authentifizierung in der gleichen directo ist nicht erforderlich ry, aber die URL wird immer noch mit dem Benutzernamen/Passwort darin besucht, die Werte des Benutzernamens/Passworts scheinen nirgends gesetzt zu sein (PHP 5.3.10 läuft als CGI/FastCGI auf Apache/2.2.22).

aus PHP (und/oder .htaccess falls erforderlich), wenn keine Authentifizierung erforderlich ist, ist es eine Möglichkeit, die Werte des Benutzernamens (und/oder Passwort) abzurufen, die von einem Besucher zur Verfügung gestellt wurden, die manuell zu der URL hinzugefügt?

+2

Es kann nicht von Apache zu PHP weitergeleitet werden, wenn es nicht von der 401-Header erforderlich ist –

+1

Ich habe gerade eine Testseite gemacht und 'PHP_AUTH_USER' und' PHP_AUTH_PW' sind beide im Array $ _SERVER' gesetzt, auch wenn es keine gibt Authentifizierung erforderlich. – Phil

+1

@Phil Hmm ... Das lässt mich fragen, ob dieses spezielle Setup, mit dem ich arbeite, ein Apache-Modul oder so etwas vermisst. Und wenn das der Fall ist, welcher wäre es? Wenn Sie unnötige Benutzer-/Pass-Zugangsdaten senden, enthalten 'PHP_AUTH_USER' und' PHP_AUTH_PW' die gesendeten Werte? – jerdiggity

Antwort

9

TLDR; Soweit ich sehen kann, werden diese Informationen niemals an den Server gesendet, daher behaupte ich, dass dies nicht möglich ist.

Die HTTP-Authentifizierung funktioniert, wenn Sie festgelegt haben, dass der Server eine Anfrage für user/pass sendet, wenn sie noch nicht festgelegt ist. Der Browser fügt diese Informationen dann in codierter Form in einen Header Authorization ein und sendet ihn an den Server mit der Bitte.

Wie in RFC 2617 spezifiziert, Basic und Digest-Authentifizierung beschreibt Mechanismen für die Standardauthentifizierung sendet Server HTTP 401 Not Authorized Status und WWW-Authenticate Header-Felder diese Informationen anzufordern.()

Mit Tests kann man sehen, dass, wenn die Authentifizierung nie auf dem Server als erforderlich konfiguriert ist, der Server keine Authentifizierungsinformationen vom Browser anfordert und der Browser keine Benutzer-/Ausweisinformationen in die Anfrage aufnimmt. RFC nicht vor, Browser (User-Agent) auf diese Informationen nicht weitergeben, sagt aber stattdessen

Ein User-Agent, der sich mit einem Ursprung Server authentifizieren möchte - in der Regel, aber nicht notwendigerweise, nach einer 401 Empfang (Nicht autorisiert) - MÖGEN Sie dies tun, indem Sie ein Autorisierungsheaderfeld mit der Anfrage einschließen.

In der Praxis, wenn Sie die gesendeten Header beobachten können Sie sehen, dass, wenn diese Informationen vom Server angefordert wird, es in verschlüsselter Form gesendet wird unter Verwendung Authorization Header wie durch den RFC. Wenn Sie jedoch keine Authentifizierung verwenden, scheint die gesendete Anforderung diese Informationen in keiner Form zu enthalten. Ich habe dies mit IE, Firefox und Chrome-Browsern selbst bestätigt.


Wenn Sie dies selbst für das Setup testen möchten, können dies beispielsweise durchgeführt werden unter Verwendung von netcat wie folgt aus:

Zuerst laufen netcat auf dem Server:

nc -l 8888 

Dann Ausgabe eine Anfrage von Ihrem Browser zu http://testvalue:[email protected]:8888/

Als Ergebnis beobachten Sie von netcat Ausgabe alle Informationen, die an den Server gesendet werden, etwa so:

GET/HTTP/1.1 
Host: yourdomain:8888 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

Es gibt keine Informationen über Benutzer oder Kennwort irgendwo. Ich behaupte, dass, wenn der Server es nicht anfordert, es nicht da sein wird.

3

Das Hinzufügen von Benutzer und Passwort in einer URL mit http (s): // Benutzer: [email protected] wurde von mindestens Internet Explorer seit mehreren Jahren deaktiviert, soweit ich weiß.

https://support.microsoft.com/en-us/kb/834489

So bin ich nicht sicher, ob das, was Sie versuchen sogar nützlich zu erreichen ist. Ich denke, die Browser übergeben diesen Teil der URL nicht mehr.

+0

Andere Browser haben es nicht deaktiviert, aber es stimmt, dass IE hat. – eis

Verwandte Themen