6

我正在尝试构建自己的安全 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 变量以检查登录到更安全的吗?

对不起我的问题,希望我有一些意义......

4

2 回答 2

7

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

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

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

  1. 使用 SSL;另见session.cookie_secure
  2. 从良好的随机源生成标识符,即/dev/urandom在 Linux 机器上;另见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. 尽量缩短会话的生命周期,并使用高级的“记住我”功能在会话到期时重新生成会话。

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

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

于 2013-10-03T08:21:08.913 回答
3

Guessing the session id is not session hijacking. It is harder than to guess a password. But yes, if someone did get a session id, they would gain full access to the account in question.

Locking by the ID address simply means that you store the original IP address the user used when logged in in the session itself and check it at the beginning of every request to see if it hasn't changed. This way, even if an attacker gets the correct session id, they still won't be able to use it.

There's a good Wikipedia article on the topic, as well as related StackOverflow questions: 1, 2.

于 2013-10-03T08:07:47.387 回答