我正在尝试构建自己的安全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变量以检查登录更安全的吗?
对不起我的问题,希望我有所帮助...
答案 0 :(得分:7)
首先,会话数据仅存储在服务器上,因此外部客户端不能简单地创建自己的会话数据并将其发送到您的服务器。
因此,它实际上是猜测别人的会话标识符并假设他们的身份;这很困难,但并非不可能。在攻击者可以利用受害者和服务器之间的网络流量的情况下,完全无法阻止它们。
但是,您可以采取一些措施来使事情变得更安全:
session.cookie_secure
。/dev/urandom
;另见session.entropy_file
。session_regenerate_id()
session.use_only_cookies
和session.cookie_httponly
。session.use_strict_mode
。在会话中保留用户代理的计算哈希,并确保它不会更改,例如:
$_SESSION['_agent'] = sha1($_SERVER['HTTP_USER_AGENT']);
尝试尽可能缩短会话的生命周期,并使用高级"remember me" feature在会话过期时重新生成会话。
了解潜在劫持何时发生并在发生这种情况时采取适当行动也很重要。您需要跟踪哪些会话属于哪个用户,以便在其中一个用户遭到攻击时使其无效。
顺便说一下,将会话锁定到IP地址是很棘手的;一些ISP会使用户来自各种地址或多个用户来自同一地址。无论哪种方式,跟踪用户代理可能会更好,因为这不太可能改变。
答案 1 :(得分:3)
猜测会话ID不是会话劫持。 比猜测密码更难。 但是,如果有人确实获得了会话ID,他们将获得对相关帐户的完全访问权限。
通过ID地址锁定只是意味着您存储用户在登录会话时使用的原始IP地址,并在每个请求开始时检查它以查看它是否未更改。 这样,即使攻击者获得了正确的会话ID,他们仍然无法使用它。
有一个很好的维基百科article on the topic,以及相关的StackOverflow问题:1,2。