向服务器提供会话 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。
考虑下面的代码:
<?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。