【发布时间】: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