我想知道是否有可能让用户销毁会话变量。用户是否可以销毁他们的php会话
例如,如果他们清除他们的cookies会摧毁他们的会话变量?我想制作一个系统记录一个人完成了多少次失败尝试,并准备创建一个会话变量,而不是将数据插入到SQL数据库中。任何建议最有效的方式将是伟大的!
我想知道是否有可能让用户销毁会话变量。用户是否可以销毁他们的php会话
例如,如果他们清除他们的cookies会摧毁他们的会话变量?我想制作一个系统记录一个人完成了多少次失败尝试,并准备创建一个会话变量,而不是将数据插入到SQL数据库中。任何建议最有效的方式将是伟大的!
不,会话存储在服务器的tmp
文件夹中。所有用户都有会话ID(通常存储在cookie中)。
所以,即使用户清除他们的cookie,会话也会在服务器上保持活动状态,直到PHP垃圾收集生效。
但是,如果用户确实删除了会话ID,则服务器会生成一个新的会话ID。没有办法限制网站访问者可以进行的登录尝试次数,但是您可以对数据库中的用户帐户尝试登录的次数添加限制。
你会这样做,但会改变数据库中的users
表。添加time_locked_out
字段,并将其设置为默认null
和login_attempts
字段,其中默认0
。
如果帐号被尝试登录超过3次,请将time_locked_out
字段设置为当前时间,并且不要让它在该时间(或其他)之后30分钟后再次尝试登录。
好的,只是为了确保他们可以解开自己的会话身份证对吗?因为我打算在会话变量中记录该用户失败的尝试次数,但我想确保他们无法执行某些操作,例如清理那些Cookie,并让该计数器因为有新的ID而被重置。 – user2443941
如果他们删除了他们的cookies,计数器在技术上会被重置,因为当他们回到您的网站时,服务器会产生一个新的会话,并将计数器设置为'0'。您需要限制用户使用数据库尝试登录的次数,而不是依赖会话或cookie。 –
你并不是真的想要统计一个人的失败的登录尝试;相反,您想要针对一个帐户对失败的登录尝试进行计数。这需要一个会话跨越机制,所以你应该回到绘图板。
例如,您可以在用户表中保留“上次失败登录”和“最近失败登录次数”列。此外,决定失败的登录阈值(登录后采取防御措施的次数)和谨慎时间范围(如果没有登录失败的时间过长,计数器重置)。
每当尝试登录:
:
每当登录成功:
关于原厂l问题:清除cookie不会破坏用户会话信息(应该存储在服务器上),但它会使它成为孤立的,并且会一直存在,直到会话GC机制启动并清除它。
一个人(尝试猜测同事帐户)的尝试与尝试进入单个帐户的人一样糟糕。你有什么“会话跨越”的例子吗?关于企业网络的误报呢? –
@AbsoluteƵERØ:我写了“destroy *用户会话信息*”(数据),而不是“会话”。重申你的第二点评论:首先,这不是我如何解释这个问题;其次,用超时保护帐户会使攻击变得毫无价值 - 使得许多无价值的攻击并行进行,就像做一个一样无害,所以我不确定一个人如何尝试猜测同事帐户会改变图片;第三,如果有人想记录每次尝试失败的IP地址(以确定来源),我不会阻止它们。我不明白你想对假阳性说什么。 – Jon
我不确定第一条评论来自哪里。 (我确定这是为其他人准备的。)如果您想弄清楚某人如何利用您的网站,那么来自每次攻击的所有数据都会很有帮助。没有任何攻击是无害的。它需要带宽和资源(包括你的时间)试图弄清楚发生了什么。尝试不一定是攻击。在你的情况下,如果有人试图猜测同事的密码。他们猜测两次,然后同事回来,他们有三次更多的尝试,因为石板被擦干净。他们将来自同一知识产权(两个不同的人)。 –
不,用户不能销毁会话。用户可以做的就是停止使用它(例如通过删除cookie)。
会议以这种方式工作:
从现在起,客户端向您的网站发出的每个请求都会包含唯一的ID作为Cookie数据。但是如果用户删除了cookie呢?会话将不会被使用,但它仍然存储在您的服务器中(直到过期时间发生)。
而且,试图解决你的问题......最好的方法是在数据库中存储用户的标识符(例如用户名)以及他尝试执行所需操作的次数。这样,当他试图这样做时,您可以比较传递的数据与数据库数据并执行适当的操作。 –
会话将数据存储在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'] - )。这样,您可以在登录脚本中设置逻辑,以防止基于用户可能具有的最大并发连接数的任何新登录。这只是一个简单的例子,但您也可以在时间戳中添加混合或任何其他类型的约束,以使逻辑更接近您的理想流程。
有时会话也通过地址栏传输。 –
为什么不给用户附上计数器?如果这个人不是他/她自称的那个人,那就是一种虐待。至于ip,geo-ip本地化可以帮助从统计角度来说,如果用户x总是从X国登录,并且在某个时候在不同国家有多次失败尝试,那么很可能是滥用否? – happy