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

rva*_*oni 88 php session session-fixation

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

Ama*_*ali 87

什么是session_regenerate_id()

正如函数名所示,它是一个用新的会话ID替换当前会话ID的函数,并保留当前的会话信息.

它有什么作用?

它主要有助于防止会话固定攻击.会话固定攻击是恶意用户尝试利用系统中的漏洞来修复(设置)其他用户的会话ID(SID)的地方.通过这样做,他们将获得原始用户的完全访问权限,并能够执行原本需要身份验证的任务.

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

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

正如symbecean在下面的注释中指出的那样,必须在身份验证状态的任何转换时更改会话ID,并且在身份验证转换时更改.

进一步阅读:

  • 如果黑客拨打第 20 次电话,会附加什么?会话 ID 已更改,他是唯一拥有该会话的人 ;)) (2认同)

Dim*_*rab 21

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

这个Security.SE回答:

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

这个网页:

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

何时使用

当用户编辑/更新某些重要输入(更改密码,凭据,忘记密码等)时,可能会危及网站安全或隐私政策.

也可以看看:

PHP安全指南:会话

会话固定(很好读)


Mac*_*ity 18

我认为会话中毒问题已经得到很好的解决.

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

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

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

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

每当我们向会话添加关键数据时,您都应该考虑重新生成会话ID.如果您需要强化您的应用程序以防止固定,那么随机再生可能是有用的,但我永远不会在每个请求上重新生成.默认情况下,PHP将会话存储在本地磁盘上的文件中.您正在添加大量磁盘I/O以缓解相对较小的攻击媒介.如果你真的需要更多的安全性,我会提倡在定期重新生成完全HTTPS(HTTPS使得固定非常难以实现).

  • 但它确实使得嗅探攻击变得更加困难,可以用来获取会话ID. (3认同)
  • HTTPS在修复时不会改变任何内容. (2认同)

kel*_*nik 14

我为什么要用session_regenerate_id

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

我应该什么时候使用session_regenerate_id

每当身份验证状态发生变化时,主要是登录和注销.

Bob坐在一台公共计算机上,通过浏览stackoverflow.com,他在那里开了一个新的会话.会话ID保存在cookie中(带有httpOnly标志以防止通过javascript访问).让我们假设Stack Overflow始终启用HTTPS,并secure为Cookie设置标志.

我们现在怎么能偷走会议?

Bob写下会话ID.他离开电脑而没有关闭浏览器.现在,Alice来到这台计算机,看到已经加载了Stack Overflow.她现在登录.

现在我们正处于你应该使用的阶段session_regenerate_id.如果您在登录期间未在此处创建新的会话ID,则Bob可以使用他之前写下的会话来访问Alice的会话,并且现在将以Alice身份登录.

  • @akam - 迟到了,但值得回应...... 1. Bob 没有注销,Alice 可以使用他的登录名 - 2. Bob 注销,Alice 没有登录,Alice 可以使用他的会话 ID,但是没有活动登录来访问他的数据 - 3. Bob 注销,Alice 登录,Bob 使用会话 ID,有一个活动登录,Bob 访问 Alice 的数据。但具体来说:依赖于脚本安全性,会话 ID 不一定意味着您可以访问已注销用户的数据,但通常来说这是一种可能且高风险。 (2认同)

Has*_*lan 12

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

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

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

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

如果你有像这样的代码

session_start();
session_regenerate_id();
Run Code Online (Sandbox Code Playgroud)

您可以在每次使用您的网站时更改其会话.

现在黑客得到sessionid = 3

但是你在使用之后改变了会话,所以你的

用户有sessionid = 4 // auth

黑客有session = 3 // null

但有一点可以说你正在使用重新生成方法,而你的客户只是登录网站并关闭浏览器或不活动.您的客户端有sessionid = 4,如果黑客在该部分获取cookie,他们将拥有相同的sessionid.

如上所述,通过这种方式,您可以保护您的客户端免受一种方式的数据嗅探,但仍然不能解决这个问题.

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

抱歉英文不好.


Pet*_*ter 10

一个简单的用例:

// User visits a webshop
$shopcart = new Cart();
Run Code Online (Sandbox Code Playgroud)

启动会话并在数据库中创建条目.用户的购物车由他的会话ID标识.

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

对于添加的每个产品,我的shopcart表中都会记录一条记录.也由会话ID标识.

// User saves cart in order to use it later
$shopcart->save();
Run Code Online (Sandbox Code Playgroud)

用户决定保存他的购物车.它现在被附加到他的用户ID.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();
Run Code Online (Sandbox Code Playgroud)

重新生成sesssion id,用户现在可以开始创建另一个shopcart.


小智 6

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

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Run Code Online (Sandbox Code Playgroud)