1

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

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

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

4

2 回答 2

1

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

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

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

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

于 2013-01-20T16:46:02.797 回答
0

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

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

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

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

于 2013-01-20T16:48:18.627 回答