我正在编写一个登录脚本。当用户成功登录时,我设置$_SESSION['logged_in'] = TRUE;
然后,我只需在其他页面上检查是否为$_SESSION['logged_in'] = TRUE;
。如果是,我会显示适当的内容
一切都很好,但现在我增加了更多的安全性。登录时,将当前用户的session_id
与数据库中存储的session_id
进行核对对我有利吗?这有助于防止会话劫持吗?如果没有,我是否应该采取其他预防措施?
不,将session_id与存储在DB中的session_id进行比较是没有好处的。如果会话被劫持,这意味着劫持者拥有会话id。因此,对照DB检查它只会发现劫持者拥有有效的会话令牌。
正如noko所说,你可以检查IP,但这是你需要存储的其他东西,也是你需要对每个请求执行的其他事情。检查用户代理将毫无意义。
你能做的最好的事情来防止会话劫持是:
- 对您的登录表单和用户登录后的每个页面使用TLS/SSL。理想情况下,使用它做任何事情都是最好的
- 用户登录后旋转会话令牌。如果用户的session_id在登录前被破坏,则在登录后仍会被破坏
- 请确保您使用了足够的随机会话令牌。这将使它们难以猜测,并将使针对会话管理的暴力攻击变得非常非常困难
更新:为了详细说明#3(根据要求),我将引用并参考OWASP会话管理作弊表
会话ID必须足够长以防止暴力攻击,攻击者可以遍历整个ID值范围验证是否存在有效会话。会话ID长度必须为至少128位(16字节)。
和
会话ID必须是不可预测的(足够随机),以防止猜测攻击,攻击者能够猜测或预测ID通过统计分析技术确定有效会话。为此因此,必须使用良好的PRNG(伪随机数生成器)。会话ID值必须提供至少64位的熵(如果使用良好的PRNG,该值估计为会话ID)。