使用Session_id的会话安全性


Session security using session_id

我正在编写一个登录脚本。当用户成功登录时,我设置$_SESSION['logged_in'] = TRUE;

然后,我只需在其他页面上检查是否为$_SESSION['logged_in'] = TRUE;。如果是,我会显示适当的内容

一切都很好,但现在我增加了更多的安全性。登录时,将当前用户的session_id与数据库中存储的session_id进行核对对我有利吗?这有助于防止会话劫持吗?如果没有,我是否应该采取其他预防措施?

不,将session_id与存储在DB中的session_id进行比较是没有好处的。如果会话被劫持,这意味着劫持者拥有会话id。因此,对照DB检查它只会发现劫持者拥有有效的会话令牌。

正如noko所说,你可以检查IP,但这是你需要存储的其他东西,也是你需要对每个请求执行的其他事情。检查用户代理将毫无意义。

你能做的最好的事情来防止会话劫持是:

  1. 对您的登录表单和用户登录后的每个页面使用TLS/SSL。理想情况下,使用它做任何事情都是最好的
  2. 用户登录后旋转会话令牌。如果用户的session_id在登录前被破坏,则在登录后仍会被破坏
  3. 请确保您使用了足够的随机会话令牌。这将使它们难以猜测,并将使针对会话管理的暴力攻击变得非常非常困难

更新:为了详细说明#3(根据要求),我将引用并参考OWASP会话管理作弊表

会话ID必须足够长以防止暴力攻击,攻击者可以遍历整个ID值范围验证是否存在有效会话。会话ID长度必须为至少128位(16字节)。

会话ID必须是不可预测的(足够随机),以防止猜测攻击,攻击者能够猜测或预测ID通过统计分析技术确定有效会话。为此因此,必须使用良好的PRNG(伪随机数生成器)。会话ID值必须提供至少64位的熵(如果使用良好的PRNG,该值估计为会话ID)。