PHP会话劫持及其方法

PHP会话劫持及其方法,php,security,session,Php,Security,Session,我试图构建自己的安全PHP会话类,但实际上我想知道是什么阻止了某人模拟会话 IE,为什么test.php上的代码 $_SESSION['logged_in'] = true; 无法在index.php上工作,其中 if($_SESSION['logged_in'] == True){ echo 'logged in'; } 我知道这样做的方法是通过将会话锁定到IP地址和用户代理来生成一个安全ID来保护会话,但这到底是如何工作的呢 这意味着如果我能够猜到会话ID,我是否能够将$\u会话['l

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

IE,为什么test.php上的代码

$_SESSION['logged_in'] = true;
无法在index.php上工作,其中

if($_SESSION['logged_in'] == True){
 echo 'logged in';
}
我知道这样做的方法是通过将会话锁定到IP地址和用户代理来生成一个安全ID来保护会话,但这到底是如何工作的呢

这意味着如果我能够猜到会话ID,我是否能够将$\u会话['logged\u in']=true并模拟登录?然后我是否应该将会话变量更改为检查是否登录到更安全的会话变量


很抱歉我的问题,希望我有点道理…

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

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


有一个很好的Wikipedia,以及相关的StackOverflow问题:,。

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

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

不过,有几件事可以让事情变得更安全:

  • 使用SSL;另见
  • 从一个好的随机源生成标识符,即Linux机器上的
    /dev/uradom
    ;另见
  • 当用户登录或注销时重新生成标识符;另见
  • 使用HttpOnly cookies(并且仅使用cookies)永久保存会话标识符;另见和
  • 使用严格的会话;另见
  • 在会话中保留用户代理的计算哈希,并确保它不会更改,例如:

    $_SESSION['_agent'] = sha1($_SERVER['HTTP_USER_AGENT']);
    
  • 尽量缩短会话的生存期,并在会话过期时使用高级重新生成会话

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


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

    您是否有
    session_start()在每个页面上?您应该学习OWASP中的WebGoat课程,它们可以帮助您更好地理解事物,这是创建安全事物的必要条件。您知道的更多课程
    $\u服务器变量可以被欺骗。因此,您不能依赖
    $\u SERVER['REMOTE\u ADDR']
    进行身份验证,尤其是在广泛使用的时代。这意味着,用户可以注销,因为服务器会动态更改IP。
    $\u server['REMOTE\u ADDR']
    可以由客户端轻松更改,但不能轻松设置为与另一个客户端相同的任意值。@Gumbo的意思是(我想)客户端IP可能会因其ISP而更改。@Jack Well,我不认为这是欺骗。@Jack好吧,这绝对是真的,但没有人反对。回答得很好!谢谢:)@user2587774不客气;如果它有助于回答你的问题,请考虑接受它作为你的答案: