何时以及为什么我应该使用session_regenerate_id()?

为什么和什么时候应该在php中使用session_regenerate_id()函数? 我应该在使用session_start()之后始终使用它吗? 我读过,我必须用它来防止会话固定,这是唯一的原因吗?

什么是session_regenerate_id()

如函数名称所示,它是一个函数,将用新的会话IDreplace当前的会话ID,并保留当前的会话信息。

它有什么作用?

它主要有助于防止会话固定攻击。 会话修复攻击是恶意用户试图利用系统中的漏洞来修复(设置)另一个用户的会话ID(SID)的地方。 通过这样做,他们将获得作为原始用户的完全访问权限,并且能够执行否则将需要authentication的任务。

为防止此类攻击,请在用户成功login(或针对每个X请求)时,使用session_regenerate_id()为其分配新的会话ID。 现在只有他有会话ID,并且您的旧(固定)会话ID不再有效。

什么时候应该使用session_regenerate_id()

正如Symbecean在下面的注释中指出的那样, 只有在身份validation转换时,会话ID 才会在身份validation状态的任何转换中更改。

进一步阅读:

你应该使用session_regenerate_id()来停止会话劫持会话修复

从这个Security.SE回答 :

会话劫持是指窃取会话cookie。 与其他计算机共享本地networking时,这可以非常容易地完成。 例如在星巴克。 示例…会话Y的用户正在浏览James的网站Starbucks。 我在听他们的networkingstream量,喝着拿铁咖啡。 我将会话Y的cookies用于James的网站,并将浏览器设置为使用它们。 现在,当我访问詹姆斯的网站詹姆斯的网站。

从这个网页 :

会话固定是一种强制用户的会话ID显式值的攻击技术。 根据目标网站的function,可以利用多种技术来“修复”会话ID值。 这些技术的范围从跨站点脚本攻击到以前提出的HTTP请求。 在用户的会话ID被修复后,攻击者将等待该用户login。 一旦用户这样做,攻击者使用预定义的会话ID值来假定相同的在线身份。

何时使用

当用户正在编辑/更新一些重要的input(更改密码,凭证,忘记密码等),这可能会危及网站的安全或隐私政策。

也可以看看:

PHP安全指南:会话

会话固定(尼斯阅读)

为什么我应该使用session_regenerate_id

你应该使用它来防止会话固定 。

什么时候应该使用session_regenerate_id

每当身份validation状态发生变化时,主要是login和注销。

鲍勃坐在公共计算机上,通过浏览stackoverflow.com,他在那里开了一个新的会议。 会话ID保存在cookie中(使用httpOnly标志来阻止通过javascript访问)。 让我们想象堆栈溢出HTTPS总是启用,也为cookie设置了secure标志。

我们现在怎么能偷东西?

鲍勃写下会话ID。 他离开电脑时没有closures浏览器。 现在爱丽丝来到这台电脑,看到堆栈溢出已经加载。 她现在login。

现在我们正处于应该使用session_regenerate_id的阶段。 如果您在login过程中没有创build新的会话ID,则Bob可以使用之前logging的会话访问Alice的会话,现在将以Alice身份login。

您可以使用它来获得更好的安全性。

通过这种方式,您可以创build会话ID一次性使用。

可以说你的用户会话ID是= 3

一些黑客入侵了你的客户端,并获得他们的session_id。 所以黑客可以使用该cookie来使用他们的会话。

如果你有类似的代码

 session_start(); session_regenerate_id(); 

您每次使用您的网站都可以更改他们的会话。

现在黑客得到sessionid = 3

但是在你使用之后你已经改变了会话

用户有sessionid = 4 // auth

黑客有session = 3 // null

但有一点可以说,你正在使用重新生成的方法,你的客户端只需login网站,closures浏览器或不活动。 你的客户端有sessionid = 4,如果黑客得到那个部分的cookie,他们将有相同的sessionid。

正如上面所解释的那样,您可以保护您的客户端免于单向数据嗅探,但仍不能解决这个问题。

但是如果你使用SSL enc,它将会非常安全。

对不起英文不好。

一个简单的用例:

 // User visits a webshop $shopcart = new Cart(); 

会话启动并在数据库中进行input。 用户的shopcart由他的会话ID标识。

 // User orders items $shopcart->add('123', 20); $shopcart->add('124', 18); $shopcart->add('127', 5); 

对于每个添加的产品,在我的shopcart表中logging。 也由会话ID标识。

 // User saves cart in order to use it later $shopcart->save(); 

用户决定保存他的购物车。 现在正在附加到他的用户名。

 // Regenerate session id for user to be able to make a new cart session_regenerate_id(); 

sesssion id被重新生成,用户现在可以重新创build另一个shopcart。

我认为会话中毒问题已经很好的解决了。

回答“我应该什么时候使用这个?” 部分,重要的是退后一步,并考虑你的应用程序正在做什么与会话。 或者换句话说,这是您需要回答的关键安全问题

如果有人拿到这个会议,他们会得到什么?

如果你所做的只是跟踪匿名数据(用户来到网站,并用它来跟踪他们的访问),那么没有什么理由重新生成一个会话。 抓住这个会话劫机者不会获得任何有价值的东西。

但是,许多站点提供login。 login更改很多东西。 我可以访问我的个人资料。 我可以更改设置。 因此,劫机者可能希望我的帐户访问,特别是如果普通用户和pipe理员用户都使用会话来pipe理login。 所以当人们来到我的网站login时,我重新生成了会话。 它增加了一个额外的安全层,我新login的用户不太可能被劫持。

任何时候,我们添加关键数据到一个会话,你应该考虑重新生成会话ID。 如果你需要硬化你的应用程序反对注视,然后一个随机再生是有用的,但我永远不会再生每一个请求。 默认情况下,PHP将会话存储在本地磁盘上的文件中。 您正在添加大量磁盘I / O来减轻相对较小的攻击媒介。 如果你真的需要更多的安全性,我会主张通过定期重新生成完整的HTTPS(HTTPS使得注入非常困难)。

session_regenerate_id():无法重新生成会话ID – 会话未处于活动状态

 if(session_status() == PHP_SESSION_ACTIVE) { session_regenerate_id(); }