2015-07-31 3 views
11

Обычно, когда публично доступный каталог требует базовой аутентификации HTTP, значение $_SERVER['HTTP_AUTHORIZATION'] и/или $_SERVER['REMOTE_USER'] (или $_SERVER['PHP_AUTH_USER'], и т.д.) будут установлены и доступно для PHP, как только действительная комбинация имени пользователя/пароля была предоставлена ​​серверу.

Например, если http://www.example.com/members требует базовой аутентификации, и пользователь успешно прошел аутентификацию, используя учетные данные myusername и mypassword вручную вводить http://myusername:[email protected]/members в браузере, значение $_SERVER['HTTP_AUTHORIZATION'] будет что-то вроде:

Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk 

.. ., а стоимость $_SERVER['REMOTE_USER'] бы просто:

myusername 

Однако если аутентификация не требуется в том же Directo ry, но URL-адрес по-прежнему посещается с именем пользователя/паролем внутри него, значения имени пользователя/пароля не кажутся нигде (запуск PHP 5.3.10 как CGI/FastCGI на Apache/2.2.22).

Изнутри PHP (и/или .htaccess в случае необходимости), когда аутентификация не требуется, есть способ для получения значения имени пользователя (и/или пароля), которые были предоставлены посетителем, который вручную добавили их в URL?

+2

Он не может быть перенаправлен на PHP Apache, если он не требуется заголовком 401 –

+1

Я только что сделал тестовую страницу, и 'PHP_AUTH_USER' и' PHP_AUTH_PW' оба установлены в массив '$ _SERVER', даже если нет необходима аутентификация. – Phil

+1

@Phil Хм ... Это заставляет меня задаться вопросом, отсутствует ли в этой конкретной установке, с которой я работаю, модуль Apache или что-то в этом роде. И если это так, какой бы это было? Кроме того, если вы отправляете ненужные учетные данные пользователя/пароля, будут ли 'PHP_AUTH_USER' и' PHP_AUTH_PW' содержать те значения, которые были отправлены? – jerdiggity

ответ

9

TLDR; Насколько я вижу, эта информация никогда не отправляется на сервер, поэтому я утверждаю, что это невозможно.

Как работает аутентификация http, если вы ее установили, сервер отправляет запрос для пользователя/пароля, если он еще не установлен, и браузер затем добавляет эту информацию в закодированной форме в заголовок Authorization и отправляет ее на сервер вдоль с просьбой.

Как указано в RFC 2617, описывающее механизмы аутентификации Basic и Digest. Для базовой аутентификации сервер отправляет HTTP 401 Not Authorized и WWW-Authenticate поля заголовка для запроса этой информации. (RFC 2617, Access Authentication Framework)

С помощью тестов видно, что если аутентификация никогда не будет настроена на требуемом сервере, сервер не будет запрашивать данные аутентификации из браузера, и браузер не будет добавлять информацию пользователя/пароль в запрос. RFC не санкционировать браузер (агент пользователя), чтобы не передать эту информацию, но говорит, что вместо того, чтобы

Агент пользователя, который желает аутентифицировать себя с сервером происхождения - обычно, но не обязательно, после получения 401 (Неавторизованный) - МОЖНО сделать это, включив поле заголовка авторизации с запросом.

На практике, если вы смотрите отправляемые заголовки вы можете увидеть, что если эта информация запрашивается сервером, он передается в кодированном виде, используя Authorization заголовок, как указано в RFC. Однако, если вы не используете аутентификацию, запрос, который вы отправляете, похоже, не содержит этой информации в любой форме. Я подтвердил это с помощью браузеров IE, Firefox и Chrome.


Если вы хотите проверить это самостоятельно для вашей установки, это может быть сделано, например, с помощью Netcat, как это:

Во-первых, запустить Netcat на сервере:

nc -l 8888 

Тогда вопрос запрос от вашего браузера к http://testvalue:[email protected]:8888/

В результате наблюдайте от netcat вывод всей информации, отправляемой на сервер, примерно так:

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 

Информация о пользователе и пароле отсутствует. Я утверждаю, что, если сервер не запросит его, его там не будет.

3

Добавление пользователя и пароля в URL-адрес, используя http (s): // user: [email protected], по крайней мере, через Internet Explorer уже несколько лет, насколько я знаю.

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

Так что я не уверен, что вы пытаетесь достичь даже полезно. Я думаю, что браузеры даже не пропускают эту часть URL.

+0

Другие браузеры не отключили его, но это правда, что у IE есть. – eis