我的问题是关于会话固定的摘要:
Alice在银行http://unsafe.com/开设了一个帐户。不幸的是,爱丽丝 不是很安全。
马洛里要把爱丽丝的钱从银行拿出来。
Alice对Mallory有一定程度的信任,并会访问 马洛里送她的链接。
问题:
Q1 - 有没有办法明确阻止网站接受任何网站 会话标识符?
Q2 - 我没有在我的网站上使用$ _GET变量,所以有没有办法阻止从查询字符串中接受会话标识符?
答案 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标识符。没有用户可以为此做好准备!