问题 如何在不需要身份验证时从URL检索尝试的$ _SERVER ['REMOTE_USER']


通常,当公共可访问的目录需要基本的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作为CGI /运行Apache / 2.2.22上的FastCGI)。

从PHP内部(和/或 .htaccess 如有必要), 何时不需要身份验证,有没有办法检索手动将其添加到URL的访问者提供的用户名(和/或密码)的值?


1914
2017-07-31 02:38


起源

如果401标头不需要它,它可能不会被Apache转发给PHP - Robbie Averill
我刚做了一个测试页面 PHP_AUTH_USER 和 PHP_AUTH_PW 都设置在 $_SERVER 数组,即使不需要身份验证。 - Phil
@Phil嗯...这让我想知道我正在使用的这个特殊设置是否缺少Apache模块或其他东西。如果是这样的话,会是哪一个?此外,如果您发送不必要的用户/通行证将 PHP_AUTH_USER 和 PHP_AUTH_PW 包含已发送的值? - jerdiggity
@Phil我也做了一个测试页面,这些值似乎不在任何地方。在这里使用FastCGI,PHP 5.4.41。你使用的服务器API和PHP版本是什么? OP也可以添加该信息。 - eis


答案:


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

如果你设置了http身份验证的方式,那么服务器会发送一个user / pass请求(如果尚未设置),然后浏览器会将编码后的信息添加到 Authorization 标头并将其与请求一起发送到服务器。

如RFC 2617中所述,描述基本和摘要认证机制对于基本认证,服务器发送 HTTP 401 Not Authorized 地位和 WWW-Authenticate 标题字段以请求此信息。 (RFC 2617,访问认证框架

通过测试可以看出,如果从未在服务器上配置认证,则服务器将不会从浏览器请求认证信息,并且浏览器不会将用户/传递信息添加到请求中。 RFC并未强制要求浏览器(用户代理)不传递该信息,而是说

希望使用原始身份验证自身的用户代理   服务器 - 通常,但不一定,收到401后   (未经授权) - 可以通过包含Authorization标头字段来实现   与请求。

实际上,如果您观察发送的标头,您可以看到,如果服务器请求此信息,则使用编码形式发送 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

任何地方都没有关于用户或密码的信息。我声称除非服务器请求它,否则它不会存在。


9
2017-07-31 07:27





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

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

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


3
2017-08-17 21:57



其他浏览器没有禁用它,但IE确实如此。 - eis