【问题标题】:Are there any session security loopholes in my PHP script?我的 PHP 脚本中是否存在任何会话安全漏洞?
【发布时间】:2009-05-01 18:37:09
【问题描述】:

验证用户登录信息后,我为他们创建此会话:

 $_SESSION['username']= $userName;

然后,我像这样重定向它们:

header('Location:www.domain.com/profile/' . $_SESSION['username'];

我希望我的网站有一个美容网址,例如:www.domain.com/profile/userName

因此,在我所有的重定向链接(HTML <a> 标记或 PHP header() 函数)中,我将使用:

"www.domain.com/album/" . $_SESSION['username'];

是否存在安全漏洞?

编辑:

我需要先使用session_id()创建会话ID吗?

所以,检查:

if(!isset($_SESSION['id']){
   //redirect to login page
}

【问题讨论】:

    标签: php security url session authorization


    【解决方案1】:

    通常在使用 Sessions 时我们还需要注意 -:

    会话劫持,会话固定

    我建议在用户登录后在您的代码中将用户名存储在会话变量中,同时在会话变量中存储另一个唯一值,例如 USER AGENT。这样用户访问的每个页面我们都可以检查是否存在相同的 USER AGENT 和 SESSION ID,这将使其更加安全。为了使其更加安全,请在 User AGENT 上进行 MD% 之类的加密,以便黑客无法复制它。

    引用自 PHP 安全指南

    <?php
    
    session_start();
    
    if (isset($_SESSION['HTTP_USER_AGENT']))
    {
        if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
        {
            /* Prompt for password */
            exit;
        }
    }
    else
    {
        $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
    }
    
    ?>
    

    请参考:
    PHP Security Guide on Session
    Another Thread on Session security

    【讨论】:

      【解决方案2】:

      你在保护什么?你在做什么来验证他们是否有授权?你是否正在保护他们的个人资料并验证他们是否因为他们拥有会话密钥而获得了授权? 你从来没有提到检查他们是否有会话变量

      您甚至不需要知道会话 ID。这对于存储用户是否已获得身份验证无关紧要,这只是指示他们应该使用哪些会话信息的机制。

      当用户登录时,你想存储类似的东西

      $_SESSION['authed_user'] = true;
      

      然后,在您随后尝试编辑信息时:

      if ($_SESSION['authed_user']) {
        // do something authed users can do
      }
      

      当然,您可能真的需要某种级别的授权。我建议你考虑使用类似SimpleAuth...

      【讨论】:

      • 是的,保护他们的个人资料。例如,防止第三用户编辑他们的个人资料等
      【解决方案3】:

      您需要在允许用户编辑其个人资料的页面上获得授权。如果他们将在 http://www.domain.com/profile/[username] 页面上进行编辑,那么您需要检查他们的 $_SESSION['username'] 是否等于他们所在的个人资料页面。

      否则任何人都可以输入 URL(基本上是猜测个人资料编号或名称)并进行编辑。

      但是是的,您应该首先检查他们是否已经登录:

      if (IsSet($_SESSION['username'])) {
      // Logged in
      } else {
      // Not logged in
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-05
        • 2011-02-02
        • 1970-01-01
        • 2011-10-19
        • 2015-10-07
        • 2012-12-17
        • 1970-01-01
        • 2013-08-06
        相关资源
        最近更新 更多