如果不需要身份验证,如何从URL检索尝试的$ _SERVER [' REMOTE_USER']

时间:2015-07-31 02:38:59

标签: php .htaccess authentication http-authentication

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

例如,如果http://www.example.com/members需要基本身份验证,并且用户通过在浏览器中手动键入myusername使用凭据mypasswordhttp://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,如果需要),当不需要身份验证时,是否有办法检索用户名的值(和/或密码)由手动将其添加到网址的访问者提供?

2 个答案:

答案 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

所以我不确定你想要达到的目标是否有用。我认为浏览器甚至不再通过该部分网址了。