【问题标题】:$_SERVER and apache_request_headers() persistent across requests?$_SERVER 和 apache_request_headers() 跨请求持久化?
【发布时间】:2013-01-20 16:39:56
【问题描述】:

我正在为 php 中的 Web 服务进行身份验证。当用户进行身份验证时,会生成一个会话。最终此会话到期,用户需要再次进行身份验证。身份验证信息在 http 标头中发送。

但似乎有时变量 $_SERVER(或 apache_request_headers())会返回一些客户端在当前请求中未发送的标头(它们是在以前的请求中发送的)。例如,有时我得到的变量 $_SERVER['HTTP_RESPONSE'] 填充了以前请求的信息。

$_SERVER 或 apache_request_headers() 在请求之间“坚持”是否正常?

【问题讨论】:

    标签: php apache http-headers


    【解决方案1】:

    这取决于您是否使用浏览器访问脚本。

    您的“持久”标头可能是由于浏览器缓存造成的,但即便如此,我也不完全确定发生了什么。我尝试使用 Fiddler 运行一些测试,但无法重现问题。

    也许可以尝试清除缓存,因为以前版本的脚本中可能存储了不同的标头。

    但是,我肯定会避免在标头中发送身份验证参数。除非您使用 HTTPS,否则它们很容易被嗅探和窃取。为什么要使用标题?

    【讨论】:

    • 我正在使用 HTTPFox 来检查请求。我可以看到它们在没有响应标头的情况下退出。我也检查过wireshark。
    • 但是为什么要使用 HTTP 标头来发送身份验证信息?
    • 我发送的身份验证信息或多或少类似于 HTTP Digest 中的描述。所以我没有将用户和密码以明文形式发送到服务器,它们是经过哈希处理的。这也将按照建议在 TLS 上运行。如果我没记错的话,标头将像其他任何东西一样被加密。
    • 我将此答案标记为正确。这是某种浏览器缓存或 HTTPFox 问题,我将不得不进一步调查。通过再次运行wireshark,我可以看到请求和响应符合预期。这个结果与我在 HTTPFOX 中看到的请求似乎正确但响应错误的结果不同。感谢您的帮助。
    • 不客气。缓存通常是这样的问题。
    【解决方案2】:

    $_SERVER 包含有关服务器的信息,它不一定包含任何请求/响应信息,它在服务器生命周期内是持久的(例如,SERVER_NAME 将持久,但与请求/响应无关)

    apache_request_headers() 包含一组已发送的标头,这些标头可能包含也可能不包含任何 cookie 和会话信息 - 它们取决于您用于访问服务器的客户端。

    唯一在请求之间持续存在的东西,它是 $_SESSION,因为每次您访问 $_SESSION 超全局时,它都会获取保存在文件系统上的会话信息(基本 PHP 实现),一些框架将会话保存在数据库(例如 Yii)。

    我假设您要创建基于请求标头的身份验证,因此您实际需要做的是解析 request_headers,将其与合法用户凭据进行匹配,然后只需 open_session();并在会话中输入一个值,将用户标记为已通过身份验证,任何后续检查都将针对 $_SESSION 超全局或其他会话实现进行。

    【讨论】:

    • 感谢您的澄清。我正在或多或少地按照您的建议进行身份验证。我猜问题只是响应的缓存。
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多