我正在为php中的Web服务进行身份验证。当用户验证会话时生成。最终此会话到期,用户需要再次进行身份验证。身份验证信息在http标头中发送。
但似乎有时变量$ _SERVER(或apache_request_headers())会返回当前请求中客户端未发送的某些标头(它们是在先前的请求中发送的)。例如,有时我得到变量$ _SERVER ['HTTP_RESPONSE'],其中包含先前请求中的信息。
$ _SERVER或apache_request_headers()在请求之间'持久'是否正常?
答案 0 :(得分:1)
这取决于您是否使用浏览器访问脚本。
你的'持久'标题可能是由于浏览器缓存,但即便如此,我也不完全确定发生了什么。我尝试使用Fiddler运行一些测试,但无法复制问题。
也许尝试清除缓存,因为以前版本的脚本可能存储了不同的标头。
但是,我肯定会避免在标头中发送身份验证参数。除非您使用HTTPS,否则它们可能会被嗅闻和窃取。你为什么使用标题?
答案 1 :(得分:0)
$_SERVER
包含有关服务器的信息,它不一定包含任何请求/响应信息,它在服务器生命周期内是持久的(例如,SERVER_NAME将持续存在,但与REQUEST无关) / RESPONSE)
apache_request_headers()
包含已发送的标头数组,这些标头可能包含也可能不包含任何Cookie和会话信息 - 它们依赖于您用来访问服务器的客户端。
唯一可以在请求中保留的东西是$ _SESSION,因为每次访问$ _SESSION超全局时,它都会获取保存在文件系统上的会话信息(基本的PHP实现),一些框架会在会话中保留数据库(例如Yii)。
我假设您要创建基于请求标头的身份验证,因此您需要实际执行的操作是解析request_headers,将其与合法用户凭据进行匹配,并简单地open_session()
;并在会话中添加一个值,该值将用户标记为已经过身份验证,任何后续检查都将针对$ _SESSION超全局或针对其他一些会话实现进行。