为什么以及何时应该在php中使用session_regenerate_id()
函数?
我使用session_start()
后是否应该始终使用它?
我已经读过我必须使用它来防止会话固定,这是唯一的原因吗?
答案 0 :(得分:80)
session_regenerate_id()
?正如函数名称所示,它是一个用新的会话ID替换当前会话ID的函数,并保留当前的会话信息。
它主要有助于防止会话固定攻击。会话固定攻击是恶意用户尝试利用系统中的漏洞来修复(设置)其他用户的会话ID(SID)的地方。通过这样做,他们将获得原始用户的完全访问权限,并能够执行原本需要身份验证的任务。
要防止此类攻击,请在成功登录时(或每次X请求)使用session_regenerate_id()
为用户分配新的会话ID。现在只有他有会话ID,而你的旧(固定)会话ID不再有效。
session_regenerate_id()
?正如symbecean在下面的评论中指出的那样,必须在身份验证状态的任何转换中更改会话ID,并在身份验证转换时更改 。
进一步阅读:
答案 1 :(得分:21)
您应该使用session_regenerate_id()
来阻止会话劫持和会话固定。
会话劫持是指窃取会话cookie。与其他计算机共享本地网络时,这可以很容易地实现。例如。在星巴克。示例...会话Y的用户正在星巴克浏览James的网站。我在听他们的网络流量,喝着我的拿铁咖啡。我为James的网站带来了会话Y的cookie用户,并设置我的浏览器使用它们。现在,当我访问James的网站时,James的网站。
来自this webpage:
会话修复是一种攻击技术,可强制用户的会话ID为显式值。根据目标网站的功能,可以使用许多技术来“修复”会话ID值。这些技术的范围从跨站点脚本攻击到使用先前发出的HTTP请求来加密网站。修复用户的会话ID后,攻击者将等待该用户登录。一旦用户这样做,攻击者就使用预定义的会话ID值来假设相同的在线身份。
何时使用
当用户编辑/更新某些重要输入(更改密码,凭据,忘记密码等)时,可能会危及网站安全或隐私政策。
另见:
答案 2 :(得分:16)
我认为会话中毒的问题已经很好地解决了。
回答“我什么时候应该使用它?”部分,重要的是退后一步,考虑你的应用程序在会话中做了什么。或者,换句话说,这是您需要回答的关键安全问题
如果有人举行了这次会议,他们会获得什么?
如果您所做的只是追踪匿名数据(用户访问网站并使用它来跟踪他们的访问),则没有理由重新生成会话。抓住那个会话,劫机者不会获得任何有价值的东西。
然而,许多网站都提供登录信息。登录会改变很多东西。我可以访问我的个人资料。我可以改变设置。因此,劫持者可能希望我的帐户访问,特别是如果普通用户和管理员用户都使用会话来管理登录。因此,当人们访问我的网站并登录时,我会重新生成会话。它增加了一个额外的安全层,我新登录的用户不太可能被劫持。
每次我们向会话添加关键数据时,您都应该考虑重新生成会话ID。如果您需要强化您的应用程序以防止固定,那么随机再生可能是有用的,但我永远不会在每个请求上重新生成。默认情况下,PHP将会话存储在本地磁盘上的文件中。您正在添加大量磁盘I / O以缓解相对较小的攻击媒介。如果你真的需要更多的安全性,我会提倡定期使用完全HTTPS而不是重新生成(HTTPS使得固定非常难以实现)。
答案 3 :(得分:11)
session_regenerate_id
?您应该使用它来阻止session fixation。
session_regenerate_id
?每当身份验证状态发生变化时,主要是登录和注销。
httpOnly
标志以防止通过javascript访问)。让我们假设Stack Overflow始终启用HTTPS,并为cookie设置secure
标志。
我们现在怎么能偷走会议?
鲍勃写下会话ID。他离开电脑而没有关闭浏览器。现在,Alice来到这台计算机,看到已经加载了Stack Overflow。她现在登录。
现在我们处于使用session_regenerate_id
的阶段。如果您在登录期间未在此处创建新的会话ID,则Bob可以使用他之前写下的会话来访问Alice的会话,并且现在将以Alice身份登录。
答案 4 :(得分:10)
您可以使用它来提高安全性。
通过这种方式,您可以创建会话ID一次性使用。
假设您的用户会话ID为= 3
一些黑客入侵了你的客户端并获取了他们的session_id。所以黑客可以使用该cookie来使用他们的会话。
如果你有像
这样的代码session_start();
session_regenerate_id();
每次使用您的网站时,您都可以更改会话。
现在黑客得到sessionid = 3
但是你在使用之后改变了会话,所以你的
用户有sessionid = 4 // auth
黑客有session = 3 // null
但有一点可以说你正在使用重新生成方法,而你的客户只是登录网站并关闭浏览器或不活动。您的客户端有sessionid = 4,如果黑客在该部分获取cookie,他们将拥有相同的sessionid。
正如上面所解释的那样,您可以通过一种方式保护您的客户端免受数据嗅探,但仍然无法解决此问题。
但是如果你使用SSL enc,它会更加安全。
抱歉英文不好。
答案 5 :(得分:10)
一个简单的用例:
// User visits a webshop
$shopcart = new Cart();
启动会话并在数据库中创建一个条目。用户的购物车由他的会话ID识别。
// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);
对于添加的每个产品,我的shopcart表中都会记录一条记录。也由会话ID识别。
// User saves cart in order to use it later
$shopcart->save();
用户决定保存他的购物车。它现在被附加到他的用户ID。
// Regenerate session id for user to be able to make a new cart
session_regenerate_id();
重新生成sesssion id,用户现在可以开始创建另一个购物车。
答案 6 :(得分:4)
session_regenerate_id():无法重新生成会话ID - 会话不是 活性
ColA ColB ColC ColD
120 1 5 Null
120 1 5 1
120 1 5 Null