【问题标题】:PHP Sessions Hijacking and its methodsPHP会话劫持及其方法
【发布时间】:2013-10-09 20:07:57
【问题描述】:

我试图构建自己的安全 PHP 会话类,但实际上我想知道是什么阻止了某人模拟会话?

IE,为什么test.php上没有代码

$_SESSION['logged_in'] = true;

无法在 index.php 上工作

if($_SESSION['logged_in'] == True){
 echo 'logged in';
}

我知道这样做的方法是通过将其锁定到 IP 地址和用户代理来生成安全 ID 来保护会话,但它究竟是如何工作的?

意思是如果我能够猜测会话 ID,我是否能够设置 $_SESSION['logged_in'] = true 并模拟登录?然后我应该更改 SESSION 变量以检查登录到更安全的吗?

抱歉我的问题,希望我能说得通...

【问题讨论】:

标签: php security session


【解决方案1】:

首先,会话数据只存储在服务器上,因此外部客户端不能简单地创建自己的会话数据并将其发送到您的服务器。

因此归结为实际猜测其他人的会话标识符并假设他们的身份;这是相当困难的,但并非不可能。在攻击者可以利用受害者和您的服务器之间的网络流量的情况下,完全不可能阻止它们。

不过,您可以采取一些措施让事情变得更安全:

  1. 使用 SSL;另见session.cookie_secure
  2. 从一个好的随机源生成标识符,即 Linux 机器上的/dev/urandom;另见session.entropy_file
  3. 在用户登录或注销时重新生成标识符;另见session_regenerate_id()
  4. 使用 HttpOnly cookie(并且仅 cookie)来永久保存会话标识符;另见session.use_only_cookiessession.cookie_httponly
  5. 使用严格的会话;另见session.use_strict_mode
  6. 在会话中保留用户代理的计算哈希并确保它不会改变,例如:

    $_SESSION['_agent'] = sha1($_SERVER['HTTP_USER_AGENT']);
    
  7. 尽量缩短会话的生命周期,并使用高级"remember me" feature 在会话到期时重新生成会话。

了解潜在的劫持何时发生并在发生时采取适当的措施也很重要。您需要跟踪哪些会话属于哪个用户,以便在其中一个会话被破坏时使所有会话失效。

顺便说一句,将会话锁定到 IP 地址很棘手;一些 ISP 会让人觉得一个用户来自不同的地址或多个用户来自同一个地址。无论哪种方式,最好跟踪用户代理,因为这不太可能改变。

【讨论】:

  • 优秀的答案!谢谢:)
  • @user2587774 不客气;如果它有助于回答您的问题,请考虑接受它作为您的答案:)
【解决方案2】:

猜测会话 id 不是会话劫持。 这比猜密码更难。 但是,是的,如果有人确实获得了会话 ID,他们将获得对相关帐户的完全访问权限。

通过 ID 地址锁定只是意味着您存储用户在会话本身中登录时使用的原始 IP 地址,并在每个请求开始时检查它以查看它是否没有更改。 这样,即使攻击者获得了正确的会话 ID,他们仍然无法使用它。

有一个很好的 Wikipedia article on the topic,以及相关的 StackOverflow 问题:12

【讨论】:

  • 您知道$_SERVER 变量可以被欺骗。因此,您不能依赖$_SERVER['REMOTE_ADDR'] 进行身份验证,尤其是在dynamic IP 被广泛使用的时代。这意味着,用户可能会被注销,因为服务器会动态更改 IP。
  • $_SERVER['REMOTE_ADDR'] 可以由客户端轻松更改,但不能轻易设置为与另一个客户端相同的任意值。
  • @Gumbo 他的意思(我认为)是客户端 IP 可能会因他们的 ISP 而改变。
  • @Jack 好吧,我不会称之为欺骗。
  • @Jack 好的,这绝对是真的,但没有人反对。
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2011-07-02
  • 1970-01-01
  • 2013-01-17
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多