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

时间:2017-04-30 23:46:24

标签: php session session-hijacking

请考虑下面的代码:

<?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开始重新计算。

当我将计数器留在与第一个网址不同的数字上然后返回第一个网址时,我看到该数字再次变回!!似乎我创建了两个不同的会话,我甚至可以创建更多这样的方式!有没有办法防止发生?

1 个答案:

答案 0 :(得分:0)

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

要防止这种情况,请添加一个简单的检查,以使用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。