PHP会话安全提示

时间:2011-01-14 21:19:27

标签: php security session

这就是我目前在登录页面上创建会话的目的。

if($count==1) {

   $_SESSION['username'] = $username;
   $_SESSION['password'] = $password;
}

我知道这是非常基本的,我需要保护用户会话。你能给我一些基本的建议吗?如果您可以编辑代码并编写安全代码,那就太棒了。感谢。

目前,我使用电子邮件地址作为会话用户名。

3 个答案:

答案 0 :(得分:6)

问自己这个问题:

  • 为什么我在数据库中的用户名是唯一的时候存储密码

在您回答说您应该得出结论毫无意义之后,您可以在登录系统中将用户名或用户ID存储在会话中。

登录系统的工作方式是,用户将表单中的用户名密码发送到验证过的服务器,在验证过程中,您从数据库where username = post_username中选择用户。

如果找不到行,则用户不存在,因此您可以在该点直接发送输出,如果用户确实存在,则将密码与post_password进行比较。

我们仅仅通过用户名选择行的原因是您应该使用某种散列系统来增加额外的安全性。

如果您将密码存储为(密码+哈希)这将是一个新字符串,您也将只存储哈希值,因此如果找到用户,则可以从(post_password + db_hash)创建哈希并检查查看它是否与db_password相同。

这样,如果您的数据库以某种方式泄露您的用户凭据更安全。

一旦用户被验证,您将在会话中存储用户ID,然后在每个页面加载时,您可以检查ID是否在会话中,如果用户当前已登录,您可以选择用户数据SELECT * FROM users WHERE id = session_id

这应该让你开始。

答案 1 :(得分:1)

通常的做法是针对数据库检查用户名和密码,然后在成功商店中只检查会话中的用户ID。然后,要查看某人是否已登录或已获得授权,您将检查该会话中存储的用户ID。但是,会话变量只有服务器可见,除非你做了一些可怕的错误。所以它并不可怕或不安全但它基本上没有必要。

修改

删除了一些关于cookie的内容,可能会引起混淆。

答案 2 :(得分:1)

/*
    SecureSession class
    Written by Vagharshak Tozalakyan <vagh@armdex.com>
    Released under GNU Public License
*/

class SecureSession {
    // Include browser name in fingerprint?
    var $check_browser = true;
    // How many numbers from IP use in fingerprint?
    var $check_ip_blocks = 0;
    // Control word - any word you want.
    var $secure_word = 'random_string_here';
    // Regenerate session ID to prevent fixation attacks?
    var $regenerate_id = true;

    // Call this when init session.
    function Open()
    {
        $_SESSION['ss_fprint'] = $this->_Fingerprint();
        $this->_RegenerateId();
    }

    // Call this to check session.
    function Check()
    {
        $this->_RegenerateId();
        return (isset($_SESSION['ss_fprint'])

        && $_SESSION['ss_fprint'] == $this->_Fingerprint());
    }

    function Destroy()
    {
        // Unset all of the session variables.
        $_SESSION = array();

        // If it's desired to kill the session, also delete the session cookie.
        // Note: This will destroy the session, and not just the session data!
        if (isset($_COOKIE[session_name()])) {
            setcookie(session_name(), '', time()-42000, '/');
        }

        // Finally, destroy the session.
        session_destroy();
    }


    // Internal function. Returns MD5 from fingerprint.
    function _Fingerprint()
    {
        $fingerprint = $this->secure_word;
        if ($this->check_browser)
            $fingerprint .= $_SERVER['HTTP_USER_AGENT'];

        if ($this->check_ip_blocks)
        {
            $num_blocks = abs(intval($this->check_ip_blocks));

            if ($num_blocks > 4)
                $num_blocks = 4;

            $blocks = explode('.', $_SERVER['REMOTE_ADDR']);

            for ($i=0; $i<$num_blocks; $i++)
            {
                $fingerprint .= $blocks[$i] . '.';
            }
        }
        return md5($fingerprint);
    }

    // Internal function. Regenerates session ID if possible.
    function _RegenerateId()
    {
        if ($this->regenerate_id && function_exists('session_regenerate_id'))
            session_regenerate_id();

    }
}