4

我的问题是关于会话固定的总结:

  • Alice 在银行有一个账户http://unsafe.com/。不幸的是,爱丽丝不是很精通安全。

  • 马洛里要去银行取爱丽丝的钱。

  • Alice 对 Mallory 有一定程度的信任,并将访问 Mallory 发送给她的链接。

    1. Mallory 已确定http://unsafe.com/接受任何会话标识符,接受来自查询字符串的会话标识符并且没有安全验证。http://unsafe.com/因此不安全。
    2. Mallory 给 Alice 发了一封电子邮件:“嘿,看看这个,我们银行有一个很酷的新帐户摘要功能,http://unsafe.com/?SID=I_WILL_KNOW_THE_SID”。Mallory 正试图将 SID 固定为 I_WILL_KNOW_THE_SID。
    3. Alice 感兴趣并访问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

4 回答 4

5

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

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

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

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

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

所有需要身份验证的受保护页面都只能通过 HTTPS 访问。因此,登录页面(用户发送用户名和密码的页面)应该通过 HTTPs 访问。在同一个脚本中,您必须重新生成一个新的 sessionID。然后必须通过 HTTPs 访问会话剩余部分的所有页面,以保护新的会话 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;
于 2012-05-23T14:15:11.383 回答
3

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

于 2012-05-23T07:44:26.563 回答
2

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

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

于 2012-05-23T07:36:27.867 回答
0

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

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

Q2。我不使用 php 5.4,但我认为以下代码会有所帮助:

unset($_GET['sid'])

更新:我认为常见的解决方法不仅仅是后端服务器可以生成 SID 标识符。没有用户对此的可能性!

于 2012-05-23T07:12:01.707 回答