我想知道用户是否有可能破坏他们的会话变量。
例如,如果他们清除他们的 cookie 会破坏他们的会话变量吗?我想建立一个系统来记录一个人完成了多少次失败的尝试,并且打算创建一个会话变量,而不是将数据插入到 SQL 数据库中。任何关于最有效方式的建议都会很棒!
我想知道用户是否有可能破坏他们的会话变量。
例如,如果他们清除他们的 cookie 会破坏他们的会话变量吗?我想建立一个系统来记录一个人完成了多少次失败的尝试,并且打算创建一个会话变量,而不是将数据插入到 SQL 数据库中。任何关于最有效方式的建议都会很棒!
不,会话存储在服务器上的一个tmp
文件夹中。用户所拥有的只是会话 ID(通常存储在 cookie 中)。
因此,即使用户清除了他们的 cookie,会话也会在服务器上保持活动状态,直到 PHP 的垃圾收集生效。
但是,如果用户确实删除了会话 ID,服务器将为他们生成一个新 ID。没有办法限制网站访问者可以进行多少次登录尝试,但您可以对数据库中的用户帐户可以尝试登录的次数添加限制。
您会这样做,但会更改users
数据库中的表。添加一个time_locked_out
字段,并将其设置为 defaultnull
和一个login_attempts
字段,使用 default 0
。
如果帐户尝试登录超过 3 次,请将time_locked_out
字段设置为当前时间,并且在该时间后 30 分钟(或其他任何时间)之前不要让它再次尝试登录。
您真的不想计算一个人的失败登录尝试;相反,您想计算一个帐户的失败登录尝试。这需要一个跨会话机制,所以你应该回到绘图板上。
例如,您可以在用户表中保留“上次失败登录”和“最近失败登录次数”列。此外,确定登录失败阈值(采取防御措施后的登录次数)和谨慎时间跨度(如果在没有失败登录的情况下经过了这么长时间,则重置计数器)。
每当尝试登录时:
每当登录失败时:
每当登录成功时:
关于最初的问题:清除 cookie 不会破坏用户会话信息(应该存储在服务器上),但它会有效地使其成为孤立的,并且它会一直存在,直到会话 GC 机制启动并清理它。
不,用户不能销毁会话。用户可以做的是停止使用它(例如,通过删除 cookie)。
会话以这种方式工作:
从现在开始,客户端对您网站的每个请求都将包含唯一 id 作为 cookie 数据。但是如果用户删除了 cookie 怎么办?该会话不会被使用,但它仍存储在您的服务器中(直到到期时间发生)。
会话将数据存储在 2 个不同的位置,如果它是基于 cookie 的会话。
有一个唯一标识符发给客户端,基于该唯一 ID 的信息存储在服务器端,与该标识符相关联。
当用户清除 cookie 时,只会从客户端删除他们的会话标识符,而不会删除与标识符相关的实际数据。通常来说,重新登录或登录到同一个帐户的用户只会简单地获得一个新的会话 ID。本质上,销毁 cookie 只会破坏指向数据的链接,因为用户不再持有会话标识符。
但是,可以使用内部帐户 ID 作为会话标识符,它可以保存有多少用户登录到 1 个特定帐户的全局计数。您将希望使用以下方法手动设置会话 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']--)。这样,您可以在登录脚本中设置逻辑,以根据用户可能拥有的最大并发连接数来防止任何新的登录。这只是一个简单的示例,但您也可以添加时间戳或任何其他类型的约束,以使逻辑更接近您的理想流程。