【问题标题】:How to retrieve attempted $_SERVER['REMOTE_USER'] from URL when no authentication is required不需要身份验证时如何从 URL 检索尝试的 $_SERVER['REMOTE_USER']
【发布时间】:2015-10-22 14:32:53
【问题描述】:

通常当一个可公开访问的目录需要基本的 HTTP 身份验证时,一旦有效的用户名/密码组合具有已提供给服务器。

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

Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk

...$_SERVER['REMOTE_USER'] 的值将是:

myusername

但是,如果在同一目录中不需要身份验证,但仍使用其中的用户名/密码访问 URL,则似乎没有在任何地方设置用户名/密码的值(运行 PHP 5.3.10作为 Apache/2.2.22 上的 CGI/FastCGI)。

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

【问题讨论】:

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

标签: php .htaccess authentication http-authentication


【解决方案1】:

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

如果您设置了 http 身份验证的工作方式,服务器会发送一个用户/密码请求(如果尚未设置),然后浏览器将该信息以编码形式添加到 Authorization 标头并将其发送到服务器连同请求一起。

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

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

希望通过来源对自己进行身份验证的用户代理 服务器——通常,但不一定,在收到 401 后 (未授权)--可以通过包含授权头字段来这样做 与请求。

在实践中,如果您观察发送的标头,您会发现如果服务器请求此信息,它会使用 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

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

【讨论】:

    【解决方案2】:

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

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

    所以我不确定你想要达到的内容是否有用。我认为浏览器甚至不再传递 URL 的那部分了。

    【讨论】:

    • 其他浏览器没有禁用,但IE确实有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多