何时以及为什么我应该使用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(); }