Подтвердить что ты не робот

Как получить попытку $_SERVER ['REMOTE_USER'] из URL, если аутентификация не требуется

Обычно, когда для общедоступного каталога требуется базовая 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

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

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

4b9b3361

Ответ 1

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

Как работает 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

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

Ответ 2

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

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

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