【问题标题】:How to reset session on each request?如何重置每个请求的会话?
【发布时间】:2011-11-20 01:50:08
【问题描述】:
            class userSessionManager
{
    public $_uname;
    private $_pword;
    private $_userDB_Accessor;

    function __construct($userAccessor)
    {
        $this->_userDB_Accessor = $userAccessor;            
    }
    function tryLogin()
    {
        //  get user information
        if ($_SERVER['REQUEST_METHOD'] == 'POST')
        {
            // get username and pasword from POST data and make it safe for database
            $this->_uname = quote_smart(htmlspecialchars($_POST['userName']));
            $this->_pword = quote_smart(htmlspecialchars($_POST['password']));
        }
        else // username and password were not set
        {
            return false;
        }

        $loginPassed = $this->_userDB_Accessor->login($this->_uname, $this->_pword);

        if($loginPassed == true)
        {
            $this->makeSession();
        }

        return $loginPassed;
    }
    private function makeSession()
    {
        session_start();
        $_SESSION['userName'] = $this->_uname;
    }
    function userHasSession()
    {
        session_start();
        if(! isset($_SESSION['userName']))  // session not properly created
        {
            return false;
        }

        $this->_uname = $_SESSION['userName'];  //save username to object

        //destroy and recreate session for security reasons
        session_destroy();
        $this->makeSession();
        return true;
    }
}

所以,我阅读了this 文章,了解某人如何使用会话 ID 号访问帐户。列出的一种解决方案是在每次加载页面时重置会话 ID 号。这会是该想法的安全实施吗?


感谢大家的建议,这是我使用它们所做的:

        private function makeSession()
    {
        session_start();
        session_regenerate_id();    // reset session id for securty
        $_SESSION['userName'] = $this->_uname;
        $_SESSION['userIP'] = $_SERVER['REMOTE_ADDR'];
        $_SESSION['userBrowser'] = $_SERVER['HTTP_USER_AGENT'];
    }
    function userHasSession()
    {
        session_start();

        if(!isset($_SESSION['userName']) || // check for a created user
            $_SESSION['userIP'] != $_SERVER['REMOTE_ADDR'] || // check for the same IP address
            $_SESSION['userBrowser'] != $_SERVER['HTTP_USER_AGENT'] //check for same Browser and OS
            ) 
        {
            session_regenerate_id();
            session_unset();
            session_destroy();
            return false;
        }
        return true;    // legit user
    }

【问题讨论】:

    标签: php session


    【解决方案1】:

    大量过度杀戮... session_destroy 不会删除会话 cookie,它只是基本上会删除

    $_SESSION = 数组()

    并删除服务器端会话数据。为防止窃取会话 cookie,您必须使用session_regenerate_id() 生成新的会话 ID。

    【讨论】:

      【解决方案2】:

      如果每次更改权限级别时都会重新生成会话标识符, 实际上消除了会话固定的风险:

      session_regenerate_id()

      <?php
      $_SESSION['logged_in'] = FALSE;
      if (check_login())
      {
      session_regenerate_id();
      $_SESSION['logged_in'] = TRUE;
      }
      ?>
      

      我不建议在每个页面上重新生成会话标识符。 虽然这似乎是一种安全的方法——而且确实如此——但它不再提供更多 保护而不是重新生成会话标识符,只要有 特权级别的变化。更重要的是,它可以不利地 影响您的合法用户,特别是如果会话标识符是 在 URL 中传播。用户可能会使用浏览器的历史记录 返回上一页的机制,以及该页面上的链接 将引用不再存在的会话标识符。如果你 仅当会话标识符发生变化时才重新生成会话标识符 特权级别,同样的情况是可能的,但用户 返回到权限级别更改之前的页面是 不太可能对会话丢失感到惊讶,并且这种情况 也不太常见。

      查看http://phpsecurity.org/ch04.pdf 了解更多信息。

      【讨论】:

        【解决方案3】:

        您应该同时使用[session_unset()][1][session_destroy()][2]。请注意,session_destroy() 仅在页面重新加载或重定向到其他页面时清空变量。只要是同一个页面,调用[session_destroy()][3]后变量仍然可用,所以最好在[session_destroy()][4]之前使用[session_unset()][5]

        【讨论】:

          【解决方案4】:

          我会将 IP 地址添加到会话中,并在用户发出的每个请求中检查它。

          【讨论】:

          • 坏主意。共享 IP 的用户太多了(想想基本上所有的移动用户、nat 代理/网关背后的人等等......)。
          • 是的,您不需要在每次页面加载时重新生成新会话。添加对 IP 的检查会有所帮助。您还可以检查浏览器、操作系统等。
          猜你喜欢
          • 1970-01-01
          • 2021-05-30
          • 2012-12-03
          • 2015-06-10
          • 2023-03-12
          • 1970-01-01
          • 2012-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多