$_SERVER和apache_request_headers()跨请求持久化



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

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

$_SERVER或apache_request_headers()在请求中"持久"是正常的吗?

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

你的"持久"头可能是由于浏览器缓存,但即使这样,我不完全确定发生了什么。我试着用Fiddler进行了一些测试,但无法重复这个问题。

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

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

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

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

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

我假设你想创建一个基于身份验证的请求头,所以你实际需要做的是解析request_headers,匹配那些合法的用户凭据,简单的open_session();并在会话中设置一个值,该值将用户标记为已验证,任何后续检查都将针对$_SESSION超全局变量或其他会话实现进行。

最新更新