代码之家  ›  专栏  ›  技术社区  ›  meade

网络会话还是无会话

  •  1
  • meade  · 技术社区  · 15 年前

    我正在考虑创建一个“会话”表,其中包含一个随机的#、用户ID、用户登录时填充的日期/时间,以及每个显示页面中用于唯一标识此人的随机#。每次用户显示页面时,如果在过去x小时内没有任何活动,则记录将用最新的日期/时间活动进行更新,我计划强制重新登录。几个问题:

    • 我应该包括IP吗(我不关心多个会话,但考虑到了增加安全性)
    • 这是否比标准的PHP会话方法(cookies等)更有效、更安全
    • 我是否应该使用这种方法以及php会话(cookie)来匹配这两种方法,以确保它是正确的人(cookie包括IP等)

    有没有更好的方法或标准安全模式(我不知道)?

    10 回复  |  直到 15 年前
        1
  •  3
  •   DisgruntledGoat    15 年前

    对我来说,你的方法听起来和饼干惊人地相似。在某个地方设置一个值,然后在每次加载页面时检查它。我不认为有必要在Cookie/sessions完全足够的情况下重新发明轮子。

    一般来说,我更喜欢使用cookie,因为这样用户就可以在会话之间保持登录状态(即当他们关闭浏览器并返回时)。

        2
  •  1
  •   Damien MATHIEU    15 年前

    为什么不使用默认的PHP会话并将其数据存储在数据库中?
    有几个函数允许您重新定义在访问或更新会话时PHP所做的事情。

    This article 这就解释了。

        3
  •  1
  •   ryeguy    15 年前

    不要使用IP。虽然这对大多数人都适用,但有些人可能有动态IP。例如,访问者可能在其ISP的负载平衡代理服务器场后面。

        4
  •  0
  •   Lizard    15 年前

    第1点-取决于人们是否使用静态IP

    第2点——负载平衡和冗余问题需要在数据库中存储会话。这还取决于应用程序的繁忙程度。

    第3点——其中一个应该足够。

        5
  •  0
  •   Kyle J. Dye    15 年前
    1. IP可能会有所帮助,但如果有人拥有动态IP,建议不要将其用于参考点以外的任何地方。

    2. 我建议使用会话方法,因为除非服务器管理员更改,否则通常需要20分钟的超时时间。

        6
  •  0
  •   Paulo    15 年前

    我建议只选择一种方法,并确保其正常工作。有多个验证听起来不错,但通常只是增加了复杂性和bug,而没有添加任何额外的功能。

    将这些值存储在会话中,因为这样开销更小,并且可以在您喜欢的时候将会话设置为过期。这解决了整个“上次登录”问题,而无需额外计算。

    会话的全部目的是在计算机上存储与该人相关的值,这正是您要查找的。复制似乎是多余的。

        7
  •  0
  •   Citizen    15 年前
    1. 使用cookies填充会话。
    2. 正常使用该会话。
    3. 确保每个会话通过db存储一个随机字符串。
    4. 将IP保存到db只是为了您自己的信息,以防您需要执行临时IP禁令,但不要像使用绝对正确一样使用它们。
        8
  •  0
  •   Abdel Raoof Olakara    15 年前

    为什么需要使用数据库进行跟踪会话。你不觉得这是开销吗?我建议您继续进行PHP会话。

        9
  •  0
  •   meade    15 年前

    我正在使用CodeIgniter——他们有一个内置的会话处理程序,似乎同时使用cookie和数据库(一个检查另一个)——我正在寻找的一切。。。。框架工作

        10
  •  0
  •   wattostudios    12 年前

    答案是两者都有!

    要点是: 你应该 从不 盲目地接受cookie或会话来验证用户,这两种方法都很容易被XSS窃取,并且可以被源站以外的恶意用户使用。

    对于用户验证,由于您无论如何都要对用户进行验证,因此实际上没有开销。 您只需在用户登录数据库时向其应用一个值,并在每次加载页面时通过某种方式进行验证。

    我选择的方法是用户会话状态的签入签出方法。 其中在页面加载时创建一个唯一ID,会话变量存储该唯一ID。 该唯一ID还存储在数据库中,用于用户ID,以及IP地址和IP更改。(我还存储了其他经过验证的信息)

    这可以用来防止两个单独的浏览器同时登录一个用户ID,这不能仅通过会话来完成,因为会话不关心是谁创建的,也不关心创建它们的时间。 但是对于签入签出,由于唯一ID总是不同的,因此会发生不匹配。

    该脚本根据数据库中的会话值和IP地址验证唯一ID。匹配完成后,更改唯一ID并更新数据库。 如果IP在x秒内更改,请为该用户执行某些操作(强制新登录),如果唯一ID不匹配,请执行其他操作(例如注销、警告等),如果上次活动是在x秒之前,请为该用户执行某些操作。

    所以登录->创建会话/用户验证->下一页->使用数据库唯一ID验证会话+验证用户->生成新会话唯一ID->更新用户最后一次登录/唯一ID

    最后,它可以让你更好地了解用户从哪里访问他们的帐户,以及从每个点访问的频率,例如:工作x3、家庭x5、移动x1。还可以让你保护你的用户免受帐户盗窃。一个德国用户突然从泰国或美国登录。通知他们更改,并向他们的电子邮件发送验证更改的请求。