【问题标题】:Same Session, Different Browser相同的会话,不同的浏览器
【发布时间】:2017-09-30 16:26:56
【问题描述】:

我在用户会话中存储主动更改的数据,即使用户使用其他浏览器或 PC 登录并最终使用新的PHP 生成的 session_id

为了解决这个问题(以及其他原因),我将用户名和 session_id 数据对存储在维护的专用数据库中,然后在 session_start() 之后执行类似(简化)的操作:

$saved_sessid=$db->querySingle("SELECT sessid FROM sessions WHERE user = '".$user."'");
if(!empty($saved_sessid)){
 session_write_close();//dump newly generated session
 session_id($saved_sessid);//apply database-saved session_id
 session_start();//launch the already existing user session
}

这是否可以确保特定用户(基于登录的用户名)仅具有特定的 PHP 会话,或者可能会导致任何不可预见的问题,可能与安全相关的问题?我自己无法找到类似的案例或对其进行足够可靠的测试,并且可以通过一些更有经验的输入来完成

【问题讨论】:

  • 它会起作用,但我建议这样做:根据客户 ID 存储数据,然后将该 ID 存储在会话中,这样他们就可以拥有 500 个会话变量(他们登录的机器)但每个都将具有相同的客户端 ID,并从一个源中提取数据
  • 在没有看到您的确切代码的情况下,我之前已经这样做过,它的工作方式完全符合您的预期。请注意,尽管serverfault.com/questions/138214/…,PHP 保存会话变量的时间是有限制的
  • @MohammedAkhtarZuberi 它究竟是如何“基于意见”的? “具体问题”是用户会话数据一致性
  • @MohammedAkhtarZuberi 我没有看到相关性。我不是要求任何人“推荐或查找书籍、工具、软件库、教程或其他非现场资源”。 “相反”,我“描述了这个问题”和“到目前为止已经做了什么来解决它”;正是它在第 4 点所说的。
  • @nogad 许多网站也使用 标签、MD5 并且不使用参数化查询。并不意味着它是好的做法或有益的。尽管如此,我还是怀疑你会发现任何使用 RDBMS 进行会话的专业、优质的网站,这不是标准做法,而且我从未在这样做的网站上工作过……无论如何,这个讨论是无声的,因为我们'我都向 OP 提出了我们的意见,我认为我们中的任何一个都不会承认一种做法更好。 o7 伴侣。

标签: php session


【解决方案1】:

正如 Xuzrus 和 nogad 评论的那样,基本上回答了“问题”,您的方法可以在没有任何添加不可预见的后果的情况下工作,至少没有直接后果。存储在session_start()session_write_close() 之间的已删除会话中的任何数据当然会丢失(我猜你预计会这样),但新用户实例随后将与“已保存”会话的数据“共享”,两个“访问点”通常由 php 在队列中处理,就好像只是不同的页面

如果您使用多个 php 实例(多线程),我不确定,但我认为 php 将会话文件锁定在 /tmp 会使两个客户端都希望同时使用会话的风险等待用于完成正在进行的处理的行,但需要对此进行确认

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多