当前位置: 首页 > 面试题库 >

PHP中正确的会话劫持预防

有睿
2023-03-14
问题内容

我知道这个话题已经讨论 了很多 ,但是我还有一些具体问题仍未得到解答。例如:

// **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 该会话ID
是一个很棒的熵池。这将比uniqid()随机得多,而uniqid()大多已经是一个时间戳了,向此混合添加另一个时间戳完全没有帮助。尽快删除此行代码。

检查IP地址是有问题的,ip地址是出于正当理由而更改的,例如用户是否位于负载平衡器或TOR之后。用户代理检查是没有意义的,就像具有GET变量一样?is_hacker=False,如果攻击者具有会话ID,则他们可能具有用户代理,如果没有,则很容易被暴力破解。



 类似资料:
  • 问题内容: 我有一个关于PHP中会话劫持的问题。我今天早上一直在阅读有关它的信息,我有一些问题在我阅读的文档中并未得到明确回答。 用户可以更改他们在我的网站上的会话吗?例如,如果他们在登录时拥有X会话,是否可以选择将该会话更改为Y或Z? 我以为会话是由浏览器设置的,因此无法更改,但是我一直在阅读的所有会话劫持资料都使我有些怀疑。 问题答案: 术语“会话”被重载以表示服务器上和浏览器中的不同内容。浏

  • 问题内容: 让我们只考虑服务器对用户的信任。 会话固定:为了避免固定,我仅在身份验证中使用(login.php) 会话劫持:整个站点的SSL加密。 我安全吗? 问题答案: 阅读OWASP A3-Broken AuthenticationandSessionManagement。另请阅读有关OWASPA5-CSRF的信息,有时也称为“会话骑行”。 您应该在php标头文件中使用以下代码: 此代码可防止

  • 4.4. 会话劫持 最常见的针对会话的攻击手段是会话劫持。它是所有攻击者可以用来访问其它人的会话的手段的总称。所有这些手段的第一步都是取得一个合法的会话标识来伪装成合法用户,因此保证会话标识不被泄露非常重要。前面几节中关于会话暴露和固定的知识能帮助你保证会话标识只有服务器及合法用户才能知道。 深度防范原则(见第一章)可以用在会话上,当会话标识不幸被攻击者知道的情况下,一些不起眼的安全措施也会提供一

  • 问题内容: 如何防止多个客户端使用相同的会话ID?我之所以这样询问,是因为我想增加一层安全保护,以防止网站上的会话劫持。如果黑客以某种方式弄清楚另一个用户的会话ID并使用该SID发出请求,我如何检测到服务器上有不同的客户端共享一个SID,然后拒绝劫持尝试? 编辑 经过深思熟虑后,我接受了Gumbo的回答,因为我意识到由于 无状态HTTP协议 的限制,我所要求的是不可能的。我忘了HTTP的最基本原理

  • session劫持是一种广泛存在的比较严重的安全威胁,在session技术中,客户端和服务端通过session的标识符来维护会话, 但这个标识符很容易就能被嗅探到,从而被其他人利用.它是中间人攻击的一种类型。 本节将通过一个实例来演示会话劫持,希望通过这个实例,能让读者更好地理解session的本质。 session劫持过程 我们写了如下的代码来展示一个count计数器: func count(w

  • 问题内容: 我已经阅读了许多有关注销脚本的php教程,我想知道从会话注销的正确方法是什么! 脚本1 剧本2 脚本3 有没有更有效的方法可以做到这一点?始终可以通过重新登录来创建会话,因此我应该为使用session_destroy()而使用unset($ _ SESSION [‘variable’])代替吗?以上3个脚本中的哪一个更可取? 问题答案: 在PHP手册的session_destroy()