3

我想知道用户是否有可能破坏他们的会话变量。

例如,如果他们清除他们的 cookie 会破坏他们的会话变量吗?我想建立一个系统来记录一个人完成了多少次失败的尝试,并且打算创建一个会话变量,而不是将数据插入到 SQL 数据库中。任何关于最有效方式的建议都会很棒!

4

4 回答 4

3

不,会话存储在服务器上的一个tmp文件夹中。用户所拥有的只是会话 ID(通常存储在 cookie 中)。

因此,即使用户清除了他们的 cookie,会话也会在服务器上保持活动状态,直到 PHP 的垃圾收集生效。

但是,如果用户确实删除了会话 ID,服务器将为他们生成一个新 ID。没有办法限制网站访问者可以进行多少次登录尝试,但您可以对数据库中的用户帐户可以尝试登录的次数添加限制。

您会这​​样做,但会更改users数据库中的表。添加一个time_locked_out字段,并将其设置为 defaultnull和一个login_attempts字段,使用 default 0

如果帐户尝试登录超过 3 次,请将time_locked_out字段设置为当前时间,并且在该时间后 30 分钟(或其他任何时间)之前不要让它再次尝试登录。

于 2013-06-01T20:00:57.873 回答
3

您真的不想计算一个人的失败登录尝试;相反,您想计算一个帐户的失败登录尝试。这需要一个跨会话机制,所以你应该回到绘图板上。

例如,您可以在用户表中保留“上次失败登录”和“最近失败登录次数”列。此外,确定登录失败阈值(采取防御措施后的登录次数)和谨慎时间跨度(如果在没有失败登录的情况下经过了这么长时间,则重置计数器)。

每当尝试登录时:

  • 如果上次登录失败的时间小于过去的“wariness timespan”并且失败的计数器等于或大于阈值,则不正常处理登录而是显示错误

每当登录失败时:

  • 如果上次失败登录时间超过过去的“警告时间跨度”,则将上次失败登录时间更新为现在并将失败登录次数重置为零
  • 无条件地将失败登录次数增加一

每当登录成功时:

  • 重置上次失败的登录时间和失败的登录次数

关于最初的问题:清除 cookie 不会破坏用户会话信息(应该存储在服务器上),但它会有效地使其成为孤立的,并且它会一直存在,直到会话 GC 机制启动并清理它。

于 2013-06-01T20:04:26.923 回答
0

不,用户不能销毁会话。用户可以做的是停止使用它(例如,通过删除 cookie)。

会话以这种方式工作:

  1. 服务器创建一个会话并生成一个唯一的 id。
  2. 服务器将唯一 id 发送给客户端,并由浏览器在本地存储为 cookie。
  3. 每次用户(浏览器)想要重新加载会话时,只需在加载页面时发送 cookie 信息。
  4. 您的服务器识别发送给它的唯一 ID 并重新加载会话(基本上,如果您使用 PHP,您的 PHP 脚本将重新生成会话变量,仅此而已)。

从现在开始,客户端对您网站的每个请求都将包含唯一 id 作为 cookie 数据。但是如果用户删除了 cookie 怎么办?该会话不会被使用,但它仍存储在您的服务器中(直到到期时间发生)。

于 2013-06-01T20:11:31.770 回答
0

会话将数据存储在 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']--)。这样,您可以在登录脚本中设置逻辑,以根据用户可能拥有的最大并发连接数来防止任何新的登录。这只是一个简单的示例,但您也可以添加时间戳或任何其他类型的约束,以使逻辑更接近您的理想流程。

于 2013-06-01T20:14:02.070 回答