我正在考虑在每个页面上使用此代码以减少会话劫持的可能性。通过在每个请求上更新session_id
if(!empty($_session)){
session_start();
}
实现目标的另一种方法是:
if(!empty($_session)){
session_regenerate_id(true);
}
但是,我听到有人批评该功能,如果由于某种原因页面刷新太快,会话ID就会失效。
使用会话ID的另一种方法是更多地控制会话的生成方式。
还有其他方法可以做到这一点。最佳做法是什么?
答案 0 :(得分:27)
在每个页面上调用session_regenerate_id
是一个不必要的开销。
您应该只在登录时或任何重新授权用户时调用它。
如果你想要另外一个,你可以在会话中存储最后一个重新生成的时间,然后在30分钟之后调用session_regenerate_id
,但是绝对不需要在每个页面上完成这个。
答案 1 :(得分:6)
我确实存在问题(在页面刷新或在ajax请求中),在每个请求上使用session_regenerate_id(true);
。
但不是session_regenerate_id();
所以,根据
更改任何权限级别后续订会话ID https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Renew_the_Session_ID_After_Any_Privilege_Level_Change
在每个请求上重新生成SID http://en.wikipedia.org/wiki/Session_fixation#Regenerate_SID_on_each_request
我用
session_regenerate_id();
session_regenerate_id(true);
登录,注销等(任何权限级别更改)答案 2 :(得分:2)
最佳做法是使用SSL(并对其他安全攻击向量(如XSS和SQL注入)应用通常的防御措施)。骑自行车会议ID只是在争夺竞争条件。
答案 3 :(得分:1)
为什么不加密和使用已经生成的会话ID,而不是生成会话ID。当预期的操作完成时,它可以被使用和销毁。
答案 4 :(得分:0)
但是,我听到有人批评该功能,如果由于某种原因页面刷新太快,会话ID就会失效。
嗯,我猜你必须尝试一下才能确认,但我认为你不会遇到这个问题。
无论如何,为每个页面加载重新生成会话并不能完全保护您免受会话劫持,并且使用最好在其他地方使用的资源。一个更好的起点是查看SSL。在客户端和Web服务器之间加密数据更安全。
我个人只在用户登录时会重新生成会话ID,并且当用户退出我的应用程序时。