首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Php会话固定示例及修复

Php会话固定示例及修复
EN

Stack Overflow用户
提问于 2012-05-23 07:03:22
回答 4查看 5.2K关注 0票数 4

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

  • 爱丽丝在http://unsafe.com/银行有个账户。不幸的是,爱丽丝对安全问题不太了解。
  • 马洛里要去银行取爱丽丝的钱。
  • 爱丽丝对马洛里有合理程度的信任,并将访问马洛里寄给她的链接。
代码语言:javascript
复制
1. Mallory has determined that [http://unsafe.com/](http://unsafe.com/) accepts any session identifier, accepts session identifiers from query strings and has no security validation. [http://unsafe.com/](http://unsafe.com/) is thus not secure. 
2. Mallory sends Alice an e-mail: "Hey, check this out, there is a cool new account summary feature on our bank,http://unsafe.com/?SID=I\_WILL\_KNOW\_THE\_SID". Mallory is trying to fixate the SID to I\_WILL\_KNOW\_THE\_SID.
3. Alice is interested and visits [http://unsafe.com/?SID=I\_WILL\_KNOW\_THE\_SID](http://unsafe.com/?SID=I_WILL_KNOW_THE_SID). The usual log-on screen pops up, and Alice logs on. 
4. Mallory visits [http://unsafe.com/?SID=I\_WILL\_KNOW\_THE\_SID](http://unsafe.com/?SID=I_WILL_KNOW_THE_SID) and now has unlimited access to Alice's account. (credit: RichieHindle)

问题:

Q1 -是否有一种方法显式地阻止站点接受任何会话标识符?

Q2 -我没有在我的站点上使用$_GET变量,那么是否有一种方法可以防止从查询字符串接受会话标识符?

  • 注:我在SSL中使用php5.4.3,也将使用session_regenerate_id。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-23 14:15:11

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

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

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

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

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

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

下面是一个伪代码login.php脚本示例:

代码语言:javascript
复制
// 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;
票数 5
EN

Stack Overflow用户

发布于 2012-05-23 07:44:26

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-23 07:36:27

问题1)如果您的应用程序需要一个会话,那么将不得不发送某种会话id。如果您的应用程序不使用会话,那么就没有必要调用session_start(),并且根本不使用If (无论是由URL还是cookie发送的)。

问题2)您可以配置PHP,只接受cookie中的会话ids,并忽略来自URL的ids (请参见曲奇饼)。如果这样做,还应该检查选项侧边是否设置为0(这是默认的)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10715002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档