session_regenerate_id()在IE11 / Edge中不起作用

时间:2016-10-21 05:40:18

标签: php session authentication cookies

我有标准认证情况...访客填写登录名+密码到表格,php脚本在数据库中验证它重定向回某页。

在此过程中,我们只需在重定向之前成功验证客户时添加session_regenerate_id(true)。 Chrome中的一切都运行良好,但它在IE11和最新版本的Edge(在虚拟框中试用 - 从modern.ie下载)的某些版本(不是全部)中不起作用。也许它在其他一些浏览器中不起作用。

它在Chrome中的运作方式:

  • 带登录表单的客户端加载页面 - 他有会话ID AAA
  • 客户端发送表单 - 请求具有会话ID AAA
  • 客户端正在通过身份验证 - session_regenerate_id(true)名为
  • 响应具有Set-cookie和会话ID BBB(+ Location:YYY)
  • 浏览器向会话ID为BBB的YYY发出请求
  • 响应没有set-cookie,因此会话ID为BBB
  • 客户端已通过身份验证

在IE11 / Edge中如何运作:

  • 带登录表单的客户端加载页面 - 他有会话ID AAA
  • 客户端发送表单 - 请求具有会话ID AAA
  • 客户端正在通过身份验证 - session_regenerate_id(true)名为
  • 响应具有Set-cookie和会话ID BBB(+ Location:YYY)
  • 浏览器向会话ID为 AAA
  • 的YYY发出请求
  • 响应没有set-cookie,因此会话ID为 AAA
  • 客户经过身份验证

问题是,在重新生成会话ID时会删除会话AAA,因此无法对客户端进行身份验证。

当没有Location标题时,它甚至不起作用,只显示带有其他页面链接的静态页面。

看起来,就像浏览器忽略了Set-cookie。

当我删除session_regenerate_id()时,它“有效”,使其安全性降低。

1 个答案:

答案 0 :(得分:1)

我自己回答我的问题...... 问题是,Set-cookie标头不包含域。

示例:www.site.com

Chrome:运行正常,从当前网址获取域名(www.site.com) Edge:不知道如何,但新会话ID保存到域site.com

解决方案:使用session_set_cookie_params()将域设置为“.site.com”(所有子域)。