【问题标题】:session_regenerate_id() doesn't work in IE11/Edgesession_regenerate_id() 在 IE11/Edge 中不起作用
【发布时间】:2017-03-03 07:45:24
【问题描述】:

我有标准的身份验证情况...访问者填写登录名+密码到表单,php脚本在数据库中对其进行身份验证并重定向回某个页面。

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

它在 Chrome 中是如何工作的:

  • 带有登录表单的客户端加载页面 - 他的会话 ID 为 AAA
  • 客户端发送表单 - 请求的会话 ID 为 AAA
  • 正在验证客户端 - 调用 session_regenerate_id(true)
  • 响应具有 Set-cookie 和会话 ID BBB(+位置:YYY)
  • 浏览器使用会话 ID BBB 向 YYY 发出请求
  • response 没有 set-cookie,所以 session id 是 BBB
  • 客户端已通过身份验证

在 IE11/Edge 中是如何工作的:

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

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

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

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

当我删除 session_regenerate_id() 时,它“工作”,但它的安全性较低。

【问题讨论】:

  • 它究竟如何不太安全
  • @FranzGleichmann - session fixation
  • 好的,在那里学到了一些新东西。谢谢

标签: php session authentication cookies


【解决方案1】:

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

示例:www.site.com

Chrome:工作正常,从当前 url (www.site.com) 获取域 Edge:不知道如何,但新的会话 ID 保存到域 site.com

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

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2019-12-13
    相关资源
    最近更新 更多