PHP 会话固定示例和修复

Hox*_*n . 4 php security session

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

  • Alice 在银行http://unsafe.com/有一个账户。不幸的是,Alice 不是很了解安全。

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

  • 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..

Mar*_*ams 5

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

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

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

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

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

所有需要身份验证的受保护页面只能通过 HTTPS 访问。因此,登录页面(用户发送用户名和密码的页面)应该通过 HTTPs 访问。在同一个脚本中,您必须重新生成一个新的 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;
Run Code Online (Sandbox Code Playgroud)