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

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

通常当一个可公开访问的目录需要基本的 HTTP 身份验证时,$_SERVER['HTTP_AUTHORIZATION'] and/or $_SERVER['REMOTE_USER'](或 $_SERVER['PHP_AUTH_USER'] 等)的值将被设置和访问到 PHP 一旦向服务器提供了有效的 username/password 组合。

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

Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk

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

myusername

但是,如果在同一个目录下不需要认证,但是URL仍然访问里面有username/password,那么username/password的值似乎不是设置在任何地方 (运行 PHP 5.3.10 as CGI/FastCGI on Apache/2.2.22).

从PHP内(and/or .htaccess如有必要),当不需要身份验证时,是否有一种检索访问者提供的用户名(and/or 密码)值的方法,访问者手动将它们添加到 URL?

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

如果您设置了 http 身份验证,它的工作方式是服务器发送 user/pass 请求(如果尚未设置),然后浏览器将该信息以编码形式添加到 Authorization header 并将其与请求一起发送到服务器。

如 RFC 2617 中所述,描述了基本和摘要身份验证机制 对于基本身份验证,服务器发送 HTTP 401 Not Authorized 状态和 WWW-Authenticate header 字段来请求此信息。 (RFC 2617, Access Authentication Framework)

通过测试可以看出,如果从未在服务器上配置需要身份验证,服务器将不会向浏览器请求身份验证信息,浏览器也不会在请求中添加 user/pass 信息。 RFC 不强制浏览器(用户代理)不传递该信息,而是说

A user agent that wishes to authenticate itself with an origin server--usually, but not necessarily, after receiving a 401 (Unauthorized)--MAY do so by including an Authorization header field with the request.

实际上,如果您查看发送的 headers,您会发现如果服务器请求此信息,它会使用 Authorization header 以指定的编码形式发送由 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 的那部分内容。