2013-06-01 40 views
3

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

例如,如果他们清除他们的cookies会摧毁他们的会话变量?我想制作一个系统记录一个人完成了多少次失败尝试,并准备创建一个会话变量,而不是将数据插入到SQL数据库中。任何建议最有效的方式将是伟大的!

+0

为什么不给用户附上计数器?如果这个人不是他/她自称的那个人,那就是一种虐待。至于ip,geo-ip本地化可以帮助从统计角度来说,如果用户x总是从X国登录,并且在某个时候在不同国家有多次失败尝试,那么很可能是滥用否? – happy

回答

3

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

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

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

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

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

+0

好的,只是为了确保他们可以解开自己的会话身份证对吗?因为我打算在会话变量中记录该用户失败的尝试次数,但我想确保他们无法执行某些操作,例如清理那些Cookie,并让该计数器因为有新的ID而被重置。 – user2443941

+0

如果他们删除了他们的cookies,计数器在技术上会被重置,因为当他们回到您的网站时,服务器会产生一个新的会话,并将计数器设置为'0'。您需要限制用户使用数据库尝试登录的次数,而不是依赖会话或cookie。 –

3

你并不是真的想要统计一个人的失败的登录尝试;相反,您想要针对一个帐户对失败的登录尝试进行计数。这需要一个会话跨越机制,所以你应该回到绘图板。

例如,您可以在用户表中保留“上次失败登录”和“最近失败登录次数”列。此外,决定失败的登录阈值(登录后采取防御措施的次数)和谨慎时间范围(如果没有登录失败的时间过长,计数器重置)。

每当尝试登录:

  • 如果最后失败的登录时间是比过去的“戒心的时间跨度”和失败的计数器等于或大于阈值,不能正确处理登录通常而是每当登录失败出现错误

  • 如果最后失败的登录时间比过去的“戒心时间跨度” ,更新上次失败的登录时间到现在和失败的登录次数重置为零
  • 无条件通过增加失败的登录计数一个

每当登录成功:

  • 复位双方最后失败的登录时间和失败的登录计数

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

+0

一个人(尝试猜测同事帐户)的尝试与尝试进入单个帐户的人一样糟糕。你有什么“会话跨越”的例子吗?关于企业网络的误报呢? –

+0

@AbsoluteƵERØ:我写了“destroy *用户会话信息*”(数据),而不是“会话”。重申你的第二点评论:首先,这不是我如何解释这个问题;其次,用超时保护帐户会使攻击变得毫无价值 - 使得许多无价值的攻击并行进行,就像做一个一样无害,所以我不确定一个人如何尝试猜测同事帐户会改变图片;第三,如果有人想记录每次尝试失败的IP地址(以确定来源),我不会阻止它们。我不明白你想对假阳性说什么。 – Jon

+0

我不确定第一条评论来自哪里。 (我确定这是为其他人准备的。)如果您想弄清楚某人如何利用您的网站,那么来自每次攻击的所有数据都会很有帮助。没有任何攻击是无害的。它需要带宽和资源(包括你的时间)试图弄清楚发生了什么。尝试不一定是攻击。在你的情况下,如果有人试图猜测同事的密码。他们猜测两次,然后同事回来,他们有三次更多的尝试,因为石板被擦干净。他们将来自同一知识产权(两个不同的人)。 –

0

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

会议以这种方式工作:

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

从现在起,客户端向您的网站发出的每个请求都会包含唯一的ID作为Cookie数据。但是如果用户删除了cookie呢?会话将不会被使用,但它仍然存储在您的服务器中(直到过期时间发生)。

+0

而且,试图解决你的问题......最好的方法是在数据库中存储用户的标识符(例如用户名)以及他尝试执行所需操作的次数。这样,当他试图这样做时,您可以比较传递的数据与数据库数据并执行适当的操作。 –

0

会话将数据存储在2个不同的地方,如果它是基于cookie的会话。

有一个唯一的标识符发布给客户端,基于该唯一标识符的信息存储在服务器端,链接到该标识符。

当用户清除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'] - )。这样,您可以在登录脚本中设置逻辑,以防止基于用户可能具有的最大并发连接数的任何新登录。这只是一个简单的例子,但您也可以在时间戳中添加混合或任何其他类型的约束,以使逻辑更接近您的理想流程。

+0

有时会话也通过地址栏传输。 –