【问题标题】:Portability of $_SERVER variables: REMOTE_USER, AUTH_USER and PHP_AUTH_USER$_SERVER 变量的可移植性:REMOTE_USER、AUTH_USER 和 PHP_AUTH_USER
【发布时间】:2017-06-30 15:12:46
【问题描述】:

获取经过 HTTP 身份验证的用户名以确保跨不同 Web 服务器(Apache、IIS、Nginx 等)的完全可移植性的最佳方法是什么?

我的理解是$_SERVER['REMOTE_USER'] 是 CGI 标准,但可以安全地假设所有 Web 服务器都支持它吗?

至少还有两个其他变体:Apache 上的 $_SERVER['PHP_AUTH_USER'] 和 IIS 上的 $_SERVER['AUTH_USER']。如果 $_SERVER['REMOTE_USER'] 是要使用的正确变量,为什么还会存在这些特定于服务器的变体?


相关线程,仅涉及 IIS/Coldfusion,不涉及 */PHP:Difference between AUTH_USER and REMOTE_USER cgi variables

【问题讨论】:

    标签: php apache authentication iis cgi


    【解决方案1】:

    REMOTE_USER 变量(对应于 PHP 中的 $_SERVER['REMOTE_USER'])是 CGI 1.1 标准,但假设所有 Web 服务器都支持它甚至以相同方式使用它是不安全的。事实上,它仅在身份验证方案是 Basic 或 Digest 时才相关,而在 IIS 中,您可以使用集成 Windows 身份验证或其他类型的身份验证(例如,基于证书或带有 ASP 页面的 Forms 身份验证)。其他网络服务器可能有自己的类似方案。

    This section of the PHP Manual 状态:

    $_SERVER 是一个包含诸如标题、路径和脚本位置等信息的数组。此数组中的条目由 Web 服务器创建。无法保证每个 Web 服务器都会提供其中的任何一个;服务器可能会省略一些,或提供其他未在此处列出的内容。也就是说,在 » CGI/1.1 规范中包含了大量这些变量,因此您应该能够预料到这些变量。

    【讨论】:

    • 关于 IIS,文档说 AUTH_USER 是要使用的正确变量,但 REMOTE_USER 始终是相同的。因此,这似乎是最便携的。 msdn.microsoft.com/en-us/library/ms524602(v=vs.90).aspx
    • 我认为您会没事的,但请记住,MSDN 文档指的是您在运行经典 ASP、ASP.NET 和 ISAPI 代码时所期望的内容。您可能会使用 FastCGI 模块,并且将用户凭据传递给 PHP 需要在 PHP 配置文件中设置 fastcgi.impersonate = 1(默认设置为该值)。同样,在将 FastCGI 与 Apache 或 nginx 一起使用时,您需要确保将所需的服务器变量转发/映射到 PHP(例如通过 fastcgi_param REMOTE_USER $remote_user;)。
    • 这听起来可以接受,因为这意味着如果 Web 服务器配置不正确,那么默认情况下,您将不会登录(因为变量不会暴露给 PHP)。因此,这听起来像是一种故障安全方法。在此基础上,我将继续使用 REMOTE_USER 并忽略其他不太便携的类似变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多