为什么以及何时应该session_regenerate_id()
在php中使用该功能?使用后是否应该始终使用它session_start()
?我读到我必须使用它来防止会话固定,这是唯一原因吗?
为什么以及何时应该session_regenerate_id()
在php中使用该功能?使用后是否应该始终使用它session_start()
?我读到我必须使用它来防止会话固定,这是唯一原因吗?
Answers:
session_regenerate_id()
啊就像函数名称所说的那样,它是一种将新的会话ID替换为新的ID,并保留当前会话信息的函数。
它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞固定(设置)另一个用户的会话ID(SID)的地方。这样,他们将拥有原始用户的完整访问权限,并且能够执行原本需要身份验证的任务。
为防止此类攻击,请在用户session_regenerate_id()
成功登录时(或对于每个X请求)使用用户分配新的会话ID 。现在只有他具有会话ID,而您的旧(固定)会话ID不再有效。
session_regenerate_id()
什么时候应该使用?正如symbecean在以下评论中所指出的,会话ID必须在身份验证状态下的任何转换时都必须更改,并且只能在身份验证转换时进行更改。
进一步阅读:
您应该使用session_regenerate_id()
以便停止会话劫持 和会话固定。
会话劫持是指窃取会话cookie。与其他计算机共享本地网络时,可以很容易地做到这一点。例如在星巴克。示例...会话Y的用户正在浏览James在星巴克的网站。我正在听他们的网络流量,喝着我的拿铁咖啡。我使用用户Y的cookie访问James的网站,并设置我的浏览器使用它们。现在,当我访问James的站点时,即James的站点。
从此网页:
会话固定是一种攻击技术,可将用户的会话ID强制为显式值。根据目标网站的功能,可以使用多种技术来“固定”会话ID值。这些技术的范围很广,从跨站点脚本攻击到向Web站点添加先前发出的HTTP请求。固定用户的会话ID后,攻击者将等待该用户登录。一旦用户这样做,攻击者便使用预定义的会话ID值来假定相同的在线身份。
何时使用
当用户编辑/更新一些重要输入(更改密码,凭据,忘记密码等)时,这些输入可能会损害站点安全性或隐私策略。
也可以看看:
我认为会话中毒的问题已经很好地解决了。
回答“我什么时候应该使用它?” 部分,退后一步并考虑您的应用程序在会话中正在做什么很重要。或者,换句话说,这是您需要回答的关键安全问题
如果有人举行了这次会议,他们会得到什么?
如果您要做的只是跟踪匿名数据(用户来到站点,然后使用它来跟踪他们的访问),则没有理由重新生成会话。劫机者通过抢劫该会话不会获得任何有价值的东西。
但是,许多站点都提供登录名。登录会改变很多事情。我可以访问我的个人资料。我可以更改设置。因此,劫机者可能希望我的帐户访问权限,特别是如果普通用户和管理员用户都使用会话来管理登录名时。因此,当人们来到我的网站并登录时,我会重新生成会话。它增加了一层额外的安全保护,使我新登录的用户不太可能被劫持。
每当我们向会话添加关键数据时,您都应考虑重新生成会话ID。如果您需要加强应用程序的固定性,那么随机重新生成可能会很有用,但我永远不会在每次请求时都重新生成。默认情况下,PHP将会话存储在本地磁盘上的文件中。您将添加大量磁盘I / O,以缓解相对较小的攻击媒介。如果您确实需要更高的安全性,我建议您使用完整的HTTPS,而不要定期重新生成(HTTPS使修复工作非常困难)。
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帐户吗?那正确吗?
您可以使用它来提高安全性。
通过这种方式,您可以创建一次使用的会话ID。
假设您的用户会话ID为= 3
一些黑客入侵了您的客户端,并获取了他们的session_id。因此,黑客可以使用该Cookie来使用其会话。
如果您有类似的代码
session_start();
session_regenerate_id();
您可以在他们每次使用您的网站时更改他们的会话。
现在黑客获取sessionid = 3
但您在他使用会话后更改了会话,因此您
用户有sessionid = 4 //身份验证
黑客拥有session = 3 // null
但是有一点要说,您正在使用重新生成方法,并且您的客户端仅登录到网站并关闭浏览器或处于非活动状态。您的客户端的sessionid = 4,并且如果黑客在那部分获取cookie,他们将具有相同的sessionid。
如上文所述,您可以通过一种方式保护客户端免受数据嗅探,但仍不能完全解决此问题。
但是,如果使用SSL enc,它将非常安全。
对不起,英语不好。
一个简单的用例:
// 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已重新生成,用户现在可以重新开始创建另一个购物车。