我喜欢让我的网站让您保持登录状态,但是如果您在一段时间内(通常是一天,但是取决于确切的一天)处于非活动状态,请将您注销项目)。
为此,我一直这样做:
setcookie(session_name(),session_id(),...);
我刚刚发现了这个功能:session_regenerate_id()
有了这个,似乎我可以用{
替换我的setcookie
代码
session_regenerate_id(true);
如果我理解正确,这将使用其初始cookie值(路径,域等)及其完整到期时间续订会话。
我是否正确地认为,在某种程度上,这会通过使窃取会话cookie变得更加困难来提供额外的安全性? (因为,毕竟,会话ID在重新生成之前只会使用一次。)
基本上,这最终会让服务器在您的下一个请求中发送一个令牌,并使用此ID" ...
我的理解是否正确?使用这样一个系统会有什么缺点(如果有的话)?
答案 0 :(得分:0)
缺点是每个会话都会创建一个新文件。 当您重新生成会话ID时,将删除旧文件并创建一个新文件。如果您的系统有大量用户(大量磁盘写入),则可能会导致严重问题。
有很多方法可以提高会话数据的安全性,但重要的是要记住,应该避免在会话中保留敏感信息。
答案 1 :(得分:0)
如果您正在使用带有cookie的会话(这是默认设置),则php.ini中的默认到期时间设置为0,这意味着当用户关闭窗口时会话被销毁。如果你想设置一个到期时间,你有两个选择:更改php.ini中的值或添加setcookie函数。
session_regenerate_id函数不会干扰是否已设置到期时间。它的目的是销毁旧会话,为用户分配一个新会话并同时保留$ _SESSION变量。 (可以给出一个可选的布尔参数来删除旧的会话cookie)。
除非您使用SSL,否则cookie将以纯文本形式发送,因此,如果他能够“嗅探”您的数据包,则可以轻松窃取会话。另一方面,不时地重新生成用户的会话将使攻击者更难以冒充实际用户。
答案 2 :(得分:0)
是的,您的理解是正确的。 session_regenerate_id()
有助于对抗会话修复。 https://stackoverflow.com/a/5081453/137259很好地解释了它。
如果会话状态发生变化(即用户登录或升级到新的访问级别),并且如果将其bool参数设置为true以删除旧会话,则无法正确使用它文件。磁盘I / O可能是@Relu在他的回答中讨论的问题,但是session_regenerate_id()
不应该过于频繁使用。