向服务器提供会话 ID 会导致会话固定

presenting a session id to the server is causing session fixation

考虑下面的代码:

<?php
session_start();

if(!isset($_SESSION['count'])) $_SESSION['count']=0;
else ++$_SESSION['count'];

echo $_SESSION['count'];
?>

当我在浏览器上调用它时http://localhost/user_login.php?PHPSESSID=1234

当我按几次重新加载时,我看到我的计数器在增加,但是当我输入

http://localhost/user_login.php?PHPSESSID=5678

重新加载几次我看到它又从 0 开始计数了。

当我将计数器留在与第一个 url 不同的数字上,然后返回到第一个 url 时,我看到数字又变回来了!!看来我已经创建了两个不同的会话,我什至可以通过这种方式创建更多会话!!!有什么办法可以防止发生吗?

这种方法非常危险,攻击者可以接管任何尚未删除或过期的会话。

为防止这种情况,请添加一个简单的检查以使用 session_regenerate_id 更改会话 ID。

此函数保留所有当前会话变量值,但用攻击者无法知道的新会话 ID 替换会话 ID。

为此,请检查您任意发明的特殊会话变量。如果它不存在,您就知道这是一个新会话,因此您只需更改会话 ID 并设置特殊会话变量以记录更改

代码:

    <?php
session_start();

if(!isset($_SESSION['initiated'])){
    session_regenerate_id();
    $_SESSION['initiated']=1;
}
if(!isset($_SESSION['count'])) $_SESSION['count']=0;
else ++$_SESSION['count'];

echo $_SESSION['count'];
?>

如果你想变得极端偏执,你甚至可以在每次请求时重新生成会话 ID。