PHP会话劫持及其方法

use*_*774 6 php security session

当我真的想知道什么阻止某人模仿会话时,我试图构建我自己的安全PHP会话类?

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

$_SESSION['logged_in'] = true;
Run Code Online (Sandbox Code Playgroud)

无法在index.php上工作

if($_SESSION['logged_in'] == True){
 echo 'logged in';
}
Run Code Online (Sandbox Code Playgroud)

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

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

对不起我的问题,希望我有所帮助......

Ja͢*_*͢ck 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']);
    
    Run Code Online (Sandbox Code Playgroud)
  7. 尝试尽可能缩短会话的生命周期,并使用高级"记住我"功能在会话过期时重新生成会话.

了解潜在劫持何时发生并在发生这种情况时采取适当行动也很重要.您需要跟踪哪些会话属于哪个用户,以便在其中一个用户遭到破坏时可以使所有会话无效.

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