PHP会话劫持及其方法

6
我正在尝试构建自己的安全PHP会话类时,我在想有什么阻止别人模拟会话的东西?
例如,为什么test.php上的代码不会这样做?
$_SESSION['logged_in'] = true;

无法在 index.php 上工作。
if($_SESSION['logged_in'] == True){
 echo 'logged in';
}

我理解的方法是通过将安全ID锁定到IP地址和用户代理来保护会话,但这究竟是如何工作的?
也就是说,如果我能够猜测会话ID,那么我是否能够设置$_SESSION['logged_in'] = true并模拟登录?那么我应该更改SESSION变量以检查更安全的登录吗?
对不起,我的问题可能有点多,希望我表达清楚了。

你的每个页面上都有 session_start(); 吗? - Mark
1
你应该从OWASP学习WebGoat课程,它们可以帮助你更好地理解事物,这是创建安全内容的必备条件。https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project - pdu
1
更多的课程在这里 - Damn Vulnerable Web App - Aaron Gong
2个回答

6
首先,会话数据仅存储在服务器上,因此外部客户端不能简单地创建自己的会话数据并将其发送到您的服务器。
因此,实际上是猜测别人的会话标识并假设他们的身份;这很困难,但不是不可能。在攻击者能够截取受害者和您的服务器之间的网络流量的情况下,根本不可能阻止他们。
然而,有几件事情可以采用来使事情更加安全:
  1. Use SSL; see also session.cookie_secure.
  2. Generate identifiers from a good random source, i.e. /dev/urandom on Linux machines; see also session.entropy_file.
  3. Regenerate the identifier when a user logs in or out; see also session_regenerate_id()
  4. Use HttpOnly cookies (and only cookies) to perpetuate a session identifier; see also session.use_only_cookies and session.cookie_httponly.
  5. Use strict sessions; see also session.use_strict_mode.
  6. Keep a computed hash of the user agent in the session and make sure it doesn't change, e.g.:

    $_SESSION['_agent'] = sha1($_SERVER['HTTP_USER_AGENT']);
    
  7. Try to reduce the lifetime of a session as short as possible and use an advanced "remember me" feature to regenerate sessions as they expire.

重要的是要知道何时发生了潜在的劫持,以及在发生时采取适当的措施。您需要跟踪哪些会话属于哪个用户,以便在其中一个被攻破时使其无效。
顺便说一下,将会话锁定到IP地址上是棘手的; 一些ISP可能会让用户看起来来自各种地址,或者多个用户来自同一地址。无论哪种方式,跟踪用户代理可能更好,因为它不太可能更改。

@user2587774 不用客气;如果它有助于回答您的问题,请考虑接受它作为您的答案 :) - Ja͢ck

3
猜测会话 ID 并不是会话劫持。 这比猜测密码更难。 但是,是的,如果有人得到了会话 ID,他们将获得对该帐户的完全访问权限。
通过 ID 地址锁定只是意味着在会话本身中存储用户登录时使用的原始 IP 地址,并在每个请求开始时检查它是否已更改。 这样,即使攻击者获得了正确的会话 ID,他们仍然无法使用它。
关于这个主题,有一个很好的维基百科文章 article on the topic,以及相关的 StackOverflow 问题:12

$_SERVER['REMOTE_ADDR'] 可被客户端轻松更改,但无法轻易设置为与另一个客户端相同的任意值。 - Denis
@Simon_eQ 那么如何欺骗 $_SERVER['REMOTE_ADDR'] - Gumbo
1
@Gumbo的意思(我想)是客户端IP可能会因为他们的ISP而改变。 - Ja͢ck
1
@Jack 嗯,我不会称之为欺骗。 - Gumbo
1
@Jack 好的,这是绝对正确的,但没有人反对它。 - Denis
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接