如何在不需要身份验证的情况下从URL检索尝试的$_SERVER['REMOTE_USER']


How to retrieve attempted $_SERVER['REMOTE_USER'] from URL when no authentication is required

通常,当一个公开访问的目录需要基本的HTTP认证时,$_SERVER['HTTP_AUTHORIZATION']和/或$_SERVER['REMOTE_USER'](或$_SERVER['PHP_AUTH_USER']等)的值将被设置,并且一旦向服务器提供了有效的用户名/密码组合,PHP就可以访问。

例如,如果http://www.example.com/members需要基本的身份验证,并且用户通过在浏览器中手动输入http://myusername:mypassword@www.example.com/members,使用凭据myusernamemypassword成功地进行了身份验证,那么$_SERVER['HTTP_AUTHORIZATION']的值将类似于:

Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk

$_SERVER['REMOTE_USER']的值简单地为:

myusername

但是,如果在同一目录中不需要身份验证,但URL仍然访问其中的用户名/密码,则用户名/密码的值似乎不会设置在任何地方(在Apache/2.2.22上运行PHP 5.3.10作为CGI/FastCGI)。

从PHP(和/或.htaccess如果必要的话),当不需要身份验证时,是否有一种方法来检索由手动添加到URL的访问者提供的用户名(和/或密码)的值?

;据我所知,信息从未发送到服务器,所以我声称这是不可能的。

http认证工作的方式,如果你有它的设置是服务器发送用户/通过的请求,如果它还没有设置,然后浏览器将该信息以编码形式添加到Authorization头,并将其发送到服务器与请求。

RFC 2617中描述了基本认证和摘要认证机制对于基本认证,服务器发送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:testvalue@yourdomain: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

没有任何用户或密码信息。我声明,除非服务器请求它,否则它不会在那里。

使用http(s)://user:pass@site.com在url中添加用户和密码已经被至少Internet Explorer禁用了好几年了,据我所知。

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

所以我不确定你想要达到的是否有用。我想浏览器甚至不再传递url的那一部分了