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


95

为什么以及何时应该session_regenerate_id()在php中使用该功能?使用后是否应该始终使用它session_start()?我读到我必须使用它来防止会话固定,这是唯一原因吗?


因为在会话开始后创建了,并且在会话开始时在另一页上创建了变量:
HaRsH 2014年

@HaRsH Oo?Session_regenerate_id删除旧的会话ID,并创建一个新的ID,例如,避免用XSS劫持会话。它对其他文档中SESSION变量的可见性没有任何影响。
Xatenev

是的,我知道我对其他变量没有影响,但是如果您不在那里启动会话,则该变量不会出现在核心php中的该页面上
HaRsH 2014年

1
但这是关于session_regenerate_id,而不是关于session_start ...
Xatenev 2014年

1
我建议阅读建议的RFC:wiki.php.net/rfc/precise_session_management
jankal

Answers:


96

什么session_regenerate_id()

就像函数名称所说的那样,它是一种将新的会话ID替换为新的ID,并保留当前会话信息的函数。

它有什么作用?

它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞固定(设置)另一个用户的会话ID(SID)的地方。这样,他们将拥有原始用户的完整访问权限,并且能够执行原本需要身份验证的任务。

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

session_regenerate_id()什么时候应该使用?

正如symbecean在以下评论中所指出的,会话ID必须在身份验证状态下的任何转换时都必须更改,并且只能在身份验证转换时进行更改。

进一步阅读:


2
如果黑客进行了第20次通话,该怎么办?会话ID已更改,他是唯一拥有该会话的人;))
fred727

@ fred727如果黑客很幸运能够打到第20个电话,则用户将具有无效的ID,并且不再通过身份验证。如果根本不进行更新,则将对黑客和用户进行身份验证。
Bradmage

在会话中存储敏感信息时,调用session_regenerate_id可能也很有用(因此不仅在身份验证时)
Adam

如果会话信息不在cookie中,是否可以修复会话?我将会话信息存储在服务器中的文件中,是否需要重新生成ID?
贡萨洛

“固定(设置)另一个用户的会话ID(SID)” ....应替换为“固定另一个用户的计算机上的会话ID(SID),然后在他进行身份验证后使用它“
会计师م19年

25

您应该使用session_regenerate_id()以便停止会话劫持会话固定

从此Security.SE答案

会话劫持是指窃取会话cookie。与其他计算机共享本地网络时,可以很容易地做到这一点。例如在星巴克。示例...会话Y的用户正在浏览James在星巴克的网站。我正在听他们的网络流量,喝着我的拿铁咖啡。我使用用户Y的cookie访问James的网站,并设置我的浏览器使用它们。现在,当我访问James的站点时,即James的站点。

从此网页

会话固定是一种攻击技术,可将用户的会话ID强制为显式值。根据目标网站的功能,可以使用多种技术来“固定”会话ID值。这些技术的范围很广,从跨站点脚本攻击到向Web站点添加先前发出的HTTP请求。固定用户的会话ID后,攻击者将等待该用户登录。一旦用户这样做,攻击者便使用预定义的会话ID值来假定相同的在线身份。

何时使用

当用户编辑/更新一些重要输入(更改密码,凭据,忘记密码等)时,这些输入可能会损害站点安全性或隐私策略。

也可以看看:

PHP安全指南:会话

会话固定(不错的阅读)


22

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

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

如果有人举行了这次会议,他们会得到什么?

如果您要做的只是跟踪匿名数据(用户来到站点,然后使用它来跟踪他们的访问),则没有理由重新生成会话。劫机者通过抢劫该会话不会获得任何有价值的东西。

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

每当我们向会话添加关键数据时,您都应考虑重新生成会话ID。如果您需要加强应用程序的固定性,那么随机重新生成可能会很有用,但我永远不会在每次请求时都重新生成。默认情况下,PHP将会话存储在本地磁盘上的文件中。您将添加大量磁盘I / O,以缓解相对较小的攻击媒介。如果您确实需要更高的安全性,我建议您使用完整的HTTPS,而不要定期重新生成(HTTPS使修复工作非常困难)。


2
HTTPS不会对固定进行任何更改。
kelunik 2015年

4
但这确实使嗅探攻击更加困难,可以首先将其用于获取会话ID。
demonkoryu '16

我的php应用程序在几秒钟内注销,正在使用再生,是否可以限制会话文件,或者是否有可能导致注销的再生ID限制?
sqlchild

一般而言,不。您可能需要发布一个单独的问题
Machavity

16

为什么要使用session_regenerate_id

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

session_regenerate_id什么时候应该使用?

每当身份验证状态更改时,主要是登录和注销。

鲍勃坐在一台公共计算机上,通过浏览stackoverflow.com,他在那里打开了一个新会话。会话ID保存在cookie中(带有httpOnly用于阻止通过javascript访问的标志)。让我们想象一下,Stack Overflow始终启用HTTPS,并且还secure为cookie设置了标志。

我们现在如何窃取会话?

鲍勃写下会话ID。他没有关闭浏览器就离开了计算机。现在,爱丽丝来到这台计算机,并看到堆栈溢出已被加载。她现在登录。

现在我们处于您应该使用的阶段session_regenerate_id。如果您在登录时未在此处创建新的会话ID,则Bob可以使用他写下的上一个会话来访问Alice的会话,并且现在将以Alice的身份登录。


但是直到那个时候session_regenerate_id()发出,爱丽丝可以访问bobs帐户吗?那正确吗?
阿卡姆

2
@akam-已经很晚了,但值得您回复... 1. Bob未注销,Alice可以使用他的登录名-2. Bob注销,Alice未登录,Alice可以使用他的会话ID,但是没有活动的登录名可以访问他的数据-3. Bob注销,Alice登录,Bob使用会话ID,存在活动的登录名,Bob访问Alice的数据。但是要具体一点:取决于脚本的安全性,会话ID不一定意味着您可以访问已注销用户的数据,但通常来说这是可能的,并且是很高的风险。
codekandis

15

您可以使用它来提高安全性。

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

假设您的用户会话ID为= 3

一些黑客入侵了您的客户端,并获取了他们的session_id。因此,黑客可以使用该Cookie来使用其会话。

如果您有类似的代码

session_start();
session_regenerate_id();

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

现在黑客获取sessionid = 3

但您在他使用会话后更改了会话,因此您

用户有sessionid = 4 //身份验证

黑客拥有session = 3 // null

但是有一点要说,您正在使用重新生成方法,并且您的客户端仅登录到网站并关闭浏览器或处于非活动状态。您的客户端的sessionid = 4,并且如果黑客在那部分获取cookie,他们将具有相同的sessionid。

如上文所述,您可以通过一种方式保护客户端免受数据嗅探,但仍不能完全解决此问题。

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

对不起,英语不好。


12

一个简单的用例:

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

开始会话并在数据库中进行输入。用户的购物车由其会话ID标识。

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

对于添加的每种产品,在我的购物车表中都有一条记录。也由会话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();

会话ID已重新生成,用户现在可以重新开始创建另一个购物车。


4

session_regenerate_id():无法重新生成会话ID-会话未激活

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.