用户可以破坏他们的php会话

时间:2013-06-01 19:58:57

标签: php

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

您可以这样做,但会更改数据库中的users表。添加time_locked_out字段,并将其设置为默认nulllogin_attempts字段,默认为0

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

答案 1 :(得分:3)

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

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

每当尝试登录时:

  • 如果上次失败的登录时间 less 而不是过去的“wariness timespan”且失败的计数器等于或大于阈值,请不要正常处理登录,而是出现错误

每当登录失败时:

  • 如果上次失败的登录时间 more 而不是过去的“wariness timespan”,请将上次失败的登录时间更新为现在,并将登录失败的次数重置为零
  • 无条件地将登录失败次数增加一次

每当登录成功时:

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

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

答案 2 :(得分:0)

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

会话以这种方式工作:

  1. 服务器创建会话并生成唯一ID。
  2. 服务器将唯一ID发送给客户端,并由浏览器本地存储为cookie。
  3. 每次用户(浏览器)想要重新加载会话时,只需在加载页面时发送cookie信息。
  4. 您的服务器识别发送给它的唯一ID并重新加载会话(基本上,如果您使用PHP,您的PHP脚本将重新生成会话变量,这就是全部)。
  5. 从现在开始,客户对您网站所做的每项请求都会将唯一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'] - )。这样,您可以在登录脚本中设置逻辑,以防止基于用户可能拥有的最大并发连接数的任何新登录。这只是一个简单的例子,但您也可以在时间戳中添加混合或任何其他类型的约束,以使逻辑更接近理想流程。