Php会话固定示例和修复

时间:2012-05-23 07:03:23

标签: php security session

我的问题是关于会话固定的摘要:

  • Alice在银行http://unsafe.com/开设了一个帐户。不幸的是,爱丽丝 不是很安全。

  • 马洛里要把爱丽丝的钱从银行拿出来。

  • Alice对Mallory有一定程度的信任,并会访问 马洛里送她的链接。

    1. Mallory确定http://unsafe.com/接受任何会话 标识符,从查询字符串接受会话标识符并具有 没有安全验证。 http://unsafe.com/因此不安全。
    2. 马洛里给爱丽丝发了一封电子邮件:“嘿,看看这个,有一个很酷的新东西 我们的帐户摘要功能 银行,http://unsafe.com/?SID = I_WILL_KNOW_THE_SID“.Mallory正在尝试 将SID固定为I_WILL_KNOW_THE_SID。
    3. 爱丽丝很感兴趣 访问http://unsafe.com/?SID=I_WILL_KNOW_THE_SID。通常的登录 屏幕弹出,Alice登录。
    4. Mallory访问http://unsafe.com/?SID=I_WILL_KNOW_THE_SID,现在可以无限制访问 到Alice的帐户。 (信用:RichieHindle)

问题:

Q1 - 有没有办法明确阻止网站接受任何网站    会话标识符?

Q2 - 我没有在我的网站上使用$ _GET变量,所以有没有办法阻止从查询字符串中接受会话标识符?

  • 注意:我正在使用带有SSL的php 5.4.3,并且还将使用session_regenerate_id ..

4 个答案:

答案 0 :(得分:4)

您可以设置答案中提到的选项martinstoeckli,但这不会阻止会话固定。它使会话固定更难以攻击,但它并没有阻止它。

正如ServerBloke所提到的,在验证用户的登录信息之后以及显示需要身份验证的第一页之前,您可以立即使用session_regenerate_id()来阻止会话固定。

让攻击者更难利用会话固定并不会阻止会话固定。您必须生成新的会话ID。

越来越多的人使用公共无担保的不受信任的Wi-Fi热点。会议可以从空中嗅到。在物理网络上,它们可以被窃听。他们还可以强制您通过中间人攻击访问任何URL。因此,即使攻击者无法向您发送URL,会话固定仍然是一个问题。

知道可以嗅探会话(和密码),还需要另一个步骤来防止会话劫持。那就是HTTPS(TLS / SSL)。

只能通过HTTPS访问所有需要身份验证的受保护页面。因此,应通过HTTP访问登录页面(用户发送其用户名和密码的页面)。在同一个脚本中,您必须重新生成一个新的sessionID。然后必须通过HTTP访问会话剩余部分的所有页面以保护新的会话ID。

以下是伪代码login.php脚本的示例:

// Force SSL
if($_SERVER["HTTPS"] != "on") {
  die('Must login via HTTPS');
}

// Load the current sessionID
session_start();

// Validate the login information, being sure to escape the input
...
if (! $valid) {
  die('Invalid login');
}

// Start the new session ID to prevent session fixation
session_regenerate_id();

// Clear the old session
$_SESSION=array();

// Log them in
$_SESSION['user_id'] = $userID;

答案 1 :(得分:3)

如果您每次用户登录时都使用session_regenerate_id(),则会阻止会话固定。当用户登录时,他们的固定会话ID将被重新生成,从而停止攻击。

答案 2 :(得分:2)

问题1)如果您的应用需要会话,您必须发送某种会话ID。如果您的应用程序不使用会话,则无需调用session_start(),并且不会使用ID(无论是通过URL还是cookie发送)。

问题2)您可以配置PHP,仅从cookie接受会话ID,并忽略URL中的ID(请参阅session.use_only_cookies)。如果这样做,您还应检查选项session.use_trans_sid是否设置为0(这是默认设置)。

答案 3 :(得分:0)

我不完全明白,这是一个真正的问题吗?

Q1。我认为您需要检查是否已经在您的会话存储中收到了来自COOKIE的GET的SID(例如,在数据库中)。如果是 - 如果不是,则在服务器端创建一个新的,并使用新的SID进行http重定向。

Q2。我不使用PHP 5.4但我认为以下代码将有所帮助:

unset($_GET['sid'])

更新:我认为常见的修复方法不仅仅是后端服务器可以生成SID标识符。没有用户可以为此做好准备!