我想知道用户是否有可能销毁他们的会话变量。
例如,如果他们清除他们的cookie会破坏他们的会话变量吗?我想建立一个系统来记录一个人完成的失败尝试次数,并且要创建一个会话变量而不是将数据插入到SQL数据库中。任何关于最有效方式的建议都会很棒!
答案 0 :(得分:3)
不,会话存储在tmp
文件夹中的服务器上。所有用户都拥有会话ID(通常存储在cookie中)。
因此,即使用户清除了cookie,会话也会在服务器上保持活动状态,直到PHP垃圾收集生效。
但是,如果用户确实删除了会话ID,则服务器会生成一个新会话ID。无法限制网站访问者可以进行的登录尝试次数,但您可以对数据库中的用户帐户可以尝试登录的次数添加限制。
您可以这样做,但会更改数据库中的users
表。添加time_locked_out
字段,并将其设置为默认null
和login_attempts
字段,默认为0
。
如果尝试登录的帐户超过3次,请将time_locked_out
字段设置为当前时间,并且不要让它再次尝试登录,直到该时间后30分钟(或其他)
答案 1 :(得分:3)
您实际上并不想计算一个人失败的登录尝试;相反,您希望计算针对一个帐户的失败登录尝试。这需要一个会话跨越机制,所以你应该回到绘图板。
例如,您可以在users表中保留“上次失败登录”和“最近登录失败次数”列。此外,确定失败的登录阈值(采取防御措施后的登录次数)和谨慎的时间跨度(如果在没有登录失败的情况下经过那么多时间,则重置计数器)。
每当尝试登录时:
每当登录失败时:
每当登录成功时:
关于原始问题:清除cookie不会破坏用户会话信息(应该存储在服务器上),但它会有效地让它成为孤儿,并且会一直存在,直到会话GC机制启动并清理它
答案 2 :(得分:0)
不,用户无法销毁会话。用户可以做的是停止使用它(例如删除cookie)。
会话以这种方式工作:
从现在开始,客户对您网站所做的每项请求都会将唯一ID包含为Cookie数据。但是如果用户删除了cookie呢?会话将不会被使用,但它仍然存储在您的服务器中(直到过期时间为止)。
答案 3 :(得分:0)
会话将数据存储在2个不同的地方,如果它是基于cookie的会话。
向客户端发布了一个唯一标识符,基于该唯一ID的信息存储在服务器端,并链接到该标识符。
当用户清除cookie时,只会从客户端删除其会话标识符,而不会删除与标识符绑定的实际数据。通常来说,只需向用户重新登录或登录同一帐户,即可获得新的会话ID。从本质上讲,销毁cookie只会破坏数据链接,因为用户不再拥有会话标识符。
但是,可以使用内部帐户ID作为会话标识符,该标识符可以包含登录到特定帐户的用户数的全局计数。您需要查看使用以下内容手动设置会话ID:http://php.net/manual/en/function.session-id.php并使用您自己的内部帐户标识符设置ID。
一个非常简单的解决方案是使用session_id()将$ _SESSION变量链接到用户的帐户ID。登录时,您可以使用用户ID启动会话,然后递增会话变量(类似于$ _SESSION ['logged_in_count'] ++)。在注销时,以ID设置为用户ID启动用户会话,并递减(如$ _SESSION ['logged_in_count'] - )。这样,您可以在登录脚本中设置逻辑,以防止基于用户可能拥有的最大并发连接数的任何新登录。这只是一个简单的例子,但您也可以在时间戳中添加混合或任何其他类型的约束,以使逻辑更接近理想流程。