1

考虑下面的代码:

<?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 时,我看到数字又变回来了!!看来我已经创建了两个不同的会话,我什至可以通过这种方式创建更多!有什么方法可以防止发生吗?

4

1 回答 1

0

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

为防止这种情况,请添加一个简单的检查以使用 更改会话 ID session_regenerate_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。

于 2017-05-01T01:29:00.957 回答