我正在考虑创建一个'会话'表,其中包含随机#,用户ID,用户登录时填充的日期/时间以及每个显示页面中使用的随机#以唯一标识该人。每次用户显示页面时,如果过去x小时内没有活动,那么记录将使用最新的日期/时间活动进行更新,而不是我计划强制重新登录。几个问题:
是否有更好的方法或标准安全模式(我不知道)?
答案 0 :(得分:3)
您的方法听起来与我的饼干惊人相似。您在某处设置了值,然后在每个页面加载时检查它。当饼干/会话完全足够时,我认为不需要重新发明轮子。
一般情况下,我更喜欢使用cookies,因为用户可以在会话之间保持登录状态(即当他们关闭浏览器并返回时)。
答案 1 :(得分:1)
为什么不使用默认的PHP会话并将其数据存储在数据库中呢? 有几个函数允许您重新定义PHP在访问或更新会话时所执行的操作。
This article解释了这一点。
答案 2 :(得分:1)
不要使用IP。虽然这对大多数人都有效,但有些人可能拥有动态IP。例如,访问者可能在他的ISP的负载平衡代理服务器群之后。
答案 3 :(得分:0)
第1点 - 取决于人们是否使用静态IP
第2点 - 负载平衡和冗余问题需要在数据库中存储会话。这还取决于你的申请有多繁忙。
第3点 - 一个或另一个应该足够。
答案 4 :(得分:0)
IP可能会有所帮助,但如果某人拥有动态IP,则不建议将其用于参考点以外的任何内容。
我建议使用会话方法,因为除非服务器管理员更改,否则通常会超时20分钟。
答案 5 :(得分:0)
我建议只选择一种方法并确保其正常工作。有多个验证听起来不错,但它通常只会增加复杂性和错误,而无需添加任何额外的功能。
将值存储在会话中,因为它的开销较小,您可以根据需要将会话设置为过期。这解决了整个“他们最后一次登录的事情”而没有多余的计算。
会话的整个目的是在该计算机上存储与该人相关的值,这正是您所寻找的。复制似乎是多余的。
答案 6 :(得分:0)
答案 7 :(得分:0)
为什么需要使用数据库进行跟踪会话。你觉得它不是一个开销吗?我建议你继续PHP会议。
答案 8 :(得分:0)
我正在使用CodeIgniter - 他们有一个内置的会话处理程序,它似乎同时使用cookie和数据库(一个检查另一个) - 我正在寻找的一切....框架工作
答案 9 :(得分:0)
答案两个!
要点: 您应该从不盲目地接受cookie或会话来验证用户,这些用户很容易被XSS窃取,并且可以被非原始用户使用。
对于用户验证,因为无论如何你要去验证用户,所以没有真正的开销。 您只需在登录数据库时应用一个值,并在每次加载页面时通过某种方式验证它。
我选择的方法是用户会话状态的签到结帐方法。 其中在页面加载时创建唯一ID,会话变量存储此唯一ID。 此唯一ID也存储在数据库中的用户ID,以及IP地址和IP更改。 (我还存储了经过验证的其他信息)
这可以用于防止2个单独的浏览器同时为单个用户ID登录,这不能仅通过会话来完成,因为会话不关心谁创建它们或何时创建它们。 但是使用checkin-checkout,因为唯一ID总是不同,所以会发生不匹配。
脚本验证数据库中会话值和IP地址的唯一ID。匹配完成后,更改唯一ID并更新数据库。 如果在x秒内更改了IP,请为该用户执行某些操作(强制新登录),如果唯一ID不匹配则执行其他操作(例如注销,警告等),如果最后一次活动是x秒前做某事对于那个用户。
所以登录 - >创建会话/用户验证 - >下一页 - >使用数据库唯一ID验证会话+验证用户 - >生成新会话唯一ID - >更新用户上次/唯一ID
最后,它可以让您更好地了解用户访问其帐户的位置以及每个点的频率EG:工作x 3,家庭x 5,移动x 1.还可以让您保护自己的帐户盗窃的用户。 EG:德国用户突然从泰国或美国登录。通知他们更改并发送请求以验证对其电子邮件的更改。