通常,当可公开访问的目录需要基本的HTTP身份验证时,$_SERVER['HTTP_AUTHORIZATION']
和/或$_SERVER['REMOTE_USER']
(或$_SERVER['PHP_AUTH_USER']
等)的值将被设置并且可以被PHP访问已向服务器提供有效的用户名/密码组合。
例如,如果http://www.example.com/members
需要基本身份验证,并且用户通过在浏览器中手动键入myusername
使用凭据mypassword
和http://myusername:mypassword@www.example.com/members
成功进行身份验证,则值为$_SERVER['HTTP_AUTHORIZATION']
类似于:
Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk
...而$_SERVER['REMOTE_USER']
的价值只是:
myusername
但是,如果同一目录中不需要身份验证,但仍然使用其中的用户名/密码访问URL,则用户名/密码的值似乎不会设置在任何位置(运行PHP 5.3) .10作为Apache / 2.2.22上的CGI / FastCGI。)
从PHP内部(和/或.htaccess
,如果需要),当不需要身份验证时,是否有办法检索用户名的值(和/或密码)由手动将其添加到网址的访问者提供?
答案 0 :(得分:9)
TLDR;据我所知,信息从未发送到服务器,所以我声称它不可能。
如果设置了http身份验证,那么http身份验证的工作方式是服务器发送用户/密码请求(如果尚未设置),然后浏览器会将编码后的信息添加到Authorization
标头中并将其与请求一起发送到服务器。
如RFC 2617中所述,描述基本身份验证和摘要身份验证机制对于基本身份验证,服务器会发送HTTP 401 Not Authorized
状态和WWW-Authenticate
标头字段来请求此信息。 (RFC 2617, Access Authentication Framework)
通过测试可以看出,如果从未在服务器上配置身份验证,则服务器不会从浏览器请求身份验证信息,并且浏览器不会将用户/传递信息添加到请求中。 RFC并未强制要求浏览器(用户代理)不传递该信息,而是说
希望使用来源对自身进行身份验证的用户代理 服务器 - 通常,但不一定,收到401后 (未经授权) - 可以通过包含Authorization标头字段来实现 请求。
实际上,如果您观察发送的标头,您可以看到,如果服务器请求此信息,则使用RFC指定的Authorization
标头以编码形式发送它。但是,如果您未使用任何身份验证,则您发送的请求似乎并不包含任何形式的信息。我自己已经通过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
任何地方都没有关于用户或密码的信息。我声称,除非服务器提出请求,否则它不会在那里。
答案 1 :(得分:3)
据我所知,使用http(s):// user:pass@site.com在网址中添加用户和密码至少已被Internet Explorer禁用了好几年了。
https://support.microsoft.com/en-us/kb/834489
所以我不确定你想要达到的目标是否有用。我认为浏览器甚至不再通过该部分网址了。