PHP会话固定例子和修复(Php session fixation example and fixe

2019-06-24 16:55发布

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

  • 艾丽斯在银行的账户http://unsafe.com/ 。 不幸的是,爱丽丝是不是很安全精明。

  • 马洛里是出从银行得到Alice的钱。

  • 爱丽丝在马洛里的信任一个合理的水平,并且将访问链接马洛里送她。

    1. 马洛里已确定http://unsafe.com/接受任何会话标识符,从查询字符串接受会话标识符,并且没有安全验证。 http://unsafe.com/因此并不安全。
    2. 马洛里向Alice发送一封电子邮件:“嘿,看看这个,对我们的银行,HTTP一个很酷的新帐户概要特征://unsafe.com/ SID = I_WILL_KNOW_THE_SID”。 马洛里正试图以固定SID来I_WILL_KNOW_THE_SID。
    3. Alice是兴趣和访问http://unsafe.com/?SID=I_WILL_KNOW_THE_SID 。 通常的登录屏幕上弹出,爱丽丝登录。
    4. 马洛里访问http://unsafe.com/?SID=I_WILL_KNOW_THE_SID ,现在有无限制的访问Alice的账户。 (来源:RichieHindle)

问题:

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

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

  • 注:我使用的是PHP 5.4.3 SSL也将使用session_regenerate_id ..

Answer 1:

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

作为ServerBloke提到的,可以防止会话固定使用session_regenerate_id()验证用户的登录信息后,你表明需要身份验证的第一页之前立即。

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

越来越多的人正在使用公共不安全不可靠的Wi-Fi热点。 会话可以从空气嗅探。 在一个物理网络,它们可以闻断丝。 他们还可以迫使你通过采用中间人攻击访问任何URL。 因此,会话固定仍然是一个问题,即使攻击者不能发送你的网址。

明知会议(和密码),可闻,有可能是为了防止会话劫持的又一步骤。 这是HTTPS(TLS / SSL)。

需要身份验证的所有受保护的页面应该只通过HTTPS访问。 所以,在登录页面(就是用户发送他们的用户名和密码)必须通过HTTPS访问。 在同一脚本,你必须重新生成一个新的会话ID。 在会议余下所有的页面必须然后通过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;


Answer 2:

如果你使用session_regenerate_id()每次你在用户登录将防止会话固定。 当用户登录时,他们迷恋的会话ID将被再生,从而停止了攻击。



Answer 3:

问题1)如果你的应用需要一个会话,你将不得不派出某种会话ID。 如果您的应用程序不使用会话,那么就没有必要再调用session_start()和IDS(无论是通过URL或Cookie发送)根本不使用。

问题2)你可以配置PHP,从饼干完全接受会话ID,而忽略从URL标识(见session.use_only_cookies )。 如果你这样做,你也应该检查,该选项session.use_trans_sid指定设置为0(这是默认值)。



Answer 4:

我不完全理解,这确实是一个问题吗?

Q1。 我认为你需要检查的还有来自于你会话存储COOKIE的GET已经收到了SID(例如数据库)。 如果是 - its'okay,如果没有,创建于服务器端的一个新的和做的HTTP与新的SID重定向。

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

unset($_GET['sid'])

更新:我认为普通补丁比仅后端服务器可以生成SID标识。 没有用户posibilites此!



文章来源: Php session fixation example and fixes