我应该在每个页面上重新生成会话ID吗?

时间:2011-08-24 18:40:41

标签: php session

我正在尝试为用户身份验证会话添加更多安全性。当用户登录我regenerate_session_id但是如果我在每个页面上regenerate_session_id我要对您进行身份验证,那么我希望您的回答能够帮助我。

在每个页面上验证用户

<?php
    session_start();

    if(!isset($_SESSION['MEMBER_ID']) || (trim($_SESSION['MEMBER_ID']) == '')) {
        header("location: denied.php");
        exit();
    }
?>

我将其更改为

session_start();

if(!isset($_SESSION['SESS_MEMBER_ID']) || (trim($_SESSION['SESS_MEMBER_ID']) == '')) {
    header("location: access-denied.php");
    exit();
} else {

session_regenerate_id(); }

2 个答案:

答案 0 :(得分:6)

您可以使用session_regenerate_id来防止会话固定攻击,其中攻击者获知给定用户的会话ID,然后“劫持”该会话ID代替用户。

但是,必须小心。首先,您必须考虑异步请求。如果您有来自用户的许多并发请求,您将希望避免一个脚本在另一个脚本尝试重新生成时使用会话数据的情况 - 一个脚本正在使用另一个脚本试图销毁的数据。

此外,这确实增加了开销。重新生成每个请求可能是一种过度杀伤力。相反,请尝试保留请求计数器;每10个请求(左右,任意选择),重新生成ID。

确保将参数传递为true - 您不希望或不需要旧会话数据(请记住,仍然是并发请求)。有关详细信息,请参阅(docs)。

所有这一切 - 这种机制是一种“微观增强”,它会给你带来比实际安全更多的虚假安全感。会话固定攻击并不常见,特别是如果您已经采取其他措施来加强安全性。没有什么可以替代,例如,使用HTTPS进行安全连接;没有什么可以取代密码复杂性要求。

答案 1 :(得分:2)

可能使事情更安全但它也会引入问题(例如,当用户在浏览器中打开多个页面的选项卡/窗口并并行浏览它们时)。在我看来,最好在会话中使用cookie。但是,你可以使用session_regenerate_id(),因为它也适用于cookie。

此外,您还应该检查用户是否仍然允许访问该页面。他/她可能已被禁止,但根据您当前的设置,他/她仍然可以访问您的页面。

相关问题