如何在PHP中正确的会话劫持预防?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (16)

我知道这个话题已经讨论了很多,但我还有一些具体的问题还没有回答。例如:

// **PREVENTING SESSION HIJACKING**
// Prevents javascript XSS attacks aimed to steal the session ID
ini_set('session.cookie_httponly', 1);

// Adds entropy into the randomization of the session ID, as PHP's random number
// generator has some known flaws
ini_set('session.entropy_file', '/dev/urandom');

// Uses a strong hash
ini_set('session.hash_function', 'whirlpool');
// **PREVENTING SESSION FIXATION**
// Session ID cannot be passed through URLs
ini_set('session.use_only_cookies', 1);

// Uses a secure connection (HTTPS) if possible
ini_set('session.cookie_secure', 1);
session_start();

// If the user is already logged
if (isset($_SESSION['uid'])) {
    // If the IP or the navigator doesn't match with the one stored in the session
    // there's probably a session hijacking going on

    if ($_SESSION['ip'] !== getIp() || $_SESSION['user_agent_id'] !== getUserAgentId()) {
        // Then it destroys the session
        session_unset();
        session_destroy();

        // Creates a new one
        session_regenerate_id(true); // Prevent's session fixation
        session_id(sha1(uniqid(microtime())); // Sets a random ID for the session
    }
} else {
    session_regenerate_id(true); // Prevent's session fixation
    session_id(sha1(uniqid(microtime())); // Sets a random ID for the session
    // Set the default values for the session
    setSessionDefaults();
    $_SESSION['ip'] = getIp(); // Saves the user's IP
    $_SESSION['user_agent_id'] = getUserAgentId(); // Saves the user's navigator
}

所以,我的问题是

  • 做了ini_set的提供足够的安全性?
  • 是否可以保存用户的IP和导航器,然后在每次加载页面时检查它以检测会话劫持?这可能会以任何方式问题吗?
  • session_regenerate_id()正确的使用?
  • session_id()正确的使用?
提问于
用户回答回答于

你的配置非常棒。你绝对了解如何锁定php会话。然而,这行代码否定了php配置提供的许多保护: session_id(sha1(uniqid(microtime()));

这是生成会话ID 的特别糟糕的方法。根据你的配置,你生成的会话ID /dev/urandom 是一个很棒的熵池。这将比uniqid()更加随机,而uniqid()已经大部分是时间戳,向这个混合添加另一个时间戳根本没有帮助。尽快删除这行代码。

检查IP地址是有问题的,由于合法的原因,例如用户在负载平衡器或TOR后面,IP地址会发生更改。用户代理检查是毫无意义的,就像拥有一个GET变量一样?is_hacker=False,如果攻击者拥有会话ID,他们可能拥有用户代理,如果他们不这样做,那么这个值很容易暴力破解。

扫码关注云+社区