jer*_*ity 11 php authentication .htaccess http-authentication
通常,当公共可访问目录需要基本HTTP身份验证时,一旦为服务器提供了有效的用户名/密码组合,PHP $_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
Run Code Online (Sandbox Code Playgroud)
......而且价值$_SERVER['REMOTE_USER']只是:
myusername
Run Code Online (Sandbox Code Playgroud)
但是,如果在同一目录中不需要身份验证,但仍然使用其中的用户名/密码访问URL,则用户名/密码的值似乎不会在任何位置设置(将PHP 5.3.10作为CGI /运行Apache/2.2.22上的FastCGI).
从PHP内部(和/或.htaccess必要时),当不需要身份验证时,是否有办法检索由手动将其添加到URL的访问者提供的用户名(和/或密码)的值?
TLDR; 据我所知,信息永远不会发送到服务器,所以我声称这是不可能的.
如果设置了http认证,那么http认证的工作方式是服务器发送用户/通过请求(如果尚未设置),然后浏览器将编码形式的信息添加到Authorization标头中,并将其与请求一起发送到服务器.
如RFC 2617中所述,描述基本身份验证和摘要身份验证机制对于基本身份验证,服务器发送HTTP 401 Not Authorized状态和WWW-Authenticate标头字段以请求此信息.(RFC 2617,访问认证框架)
通过测试可以看出,如果从未在服务器上配置身份验证,则服务器将不会从浏览器请求身份验证信息,并且浏览器不会将用户/传递信息添加到请求中.RFC并未强制要求浏览器(用户代理)不传递该信息,而是说
希望通过源服务器验证自身的用户代理 - 通常但不一定在收到401(未授权)之后 - 可以通过在请求中包含Authorization头字段来实现.
实际上,如果您观察发送的标头,您可以看到,如果服务器请求此信息,则使用AuthorizationRFC指定的标头以编码形式发送.但是,如果您没有使用任何身份验证,则您发送的请求似乎不包含任何形式的信息.我自己用IE,Firefox和Chrome浏览器证实了这一点.
如果你想自己测试一下你的设置,可以这样做,例如使用netcat,如下所示:
首先,在您的服务器上运行netcat:
nc -l 8888
Run Code Online (Sandbox Code Playgroud)
然后从您的浏览器发出请求 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
Run Code Online (Sandbox Code Playgroud)
任何地方都没有关于用户或密码的信息.我声称,除非服务器请求它,否则它不会存在.