PHP用户类安全帮助?

时间:2011-02-07 01:45:11

标签: php class session

我是PHP中的类开发新手,但我仍然对会话的概念感到困惑。

问题1:会话可以通过客户端操作进行更改吗?如果没有,我可以设置静态会话并在没有验证的情况下使用它们吗?

问题2:我应该如何管理我的用户帐户?

我确实使用SALT,但是在注册过程中会生成一个代码并将其插入到DB中,用于登录参考。任何有解释的更正都将非常受欢迎,以及客户修改会话的任何内容。

class user {
    private $username   = '';   
    private $password   = '';
    private $salt       = '';
    public  $prefix     = 'rhs_';

    function __construct () {
        $this->username = '';
        $this->password = '';
        $this->salt     = '';

        session_start();
    }

    public function login ($username, $password) {
        $mysql_conn = Database::obtain();
        $username = $mysql_conn->escape($username);
        $sql = 'SELECT `password`, `salt`, `first_name`, `last_name`, `permission` FROM `accounts` WHERE `username`="'.$username.'"';
        $row = $mysql_conn->query_first($sql);

        if(!empty($row['password'])) {
            $encrypted = md5(md5($mysql_conn->escape($password)).$row['salt']);
            if ($encrypted == $row['password']) {
                $_SESSION[$this->prefix.'username']     = $username;
                $_SESSION[$this->prefix.'password']     = $password;
                $_SESSION[$this->prefix.'name']         = $row['first_name'].' '.$row['last_name'];
                $_SESSION[$this->prefix.'permission']   = $row['permission'];
                header('location: ?page=cpanel');
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

2 个答案:

答案 0 :(得分:3)

会话是服务器上的一个文件,可以写入和保存变量。每个会话文件对应于您网站的一个活动访问者。 PHP会自动删除大约24分钟未读取或写入的文件。

会话通过cookie链接到用户。当用户浏览您使用会话的页面时,PHP会检查是否随请求一起发送了一个特殊命名的cookie,其中包含其会话标识符。

  • 如果cookie存在,该标识符告诉PHP打开哪个会话文件并读取以填充$_SESSION
  • 如果不存在cookie,则会生成一个新标识符并将其作为cookie发送给用户,并创建一个新的空会话文件。

由于会话是服务器上的文件,因此您的用户无法修改它们。

答案 1 :(得分:0)

  

我是PHP中的类开发新手

即使您是经验丰富的程序员,制作不安全的身份验证系统也很容易。您应该使用OpenID(或类似于facebook连接的类似系统)。他们有安全专家作为员工。我创建了一个little library you can use for this。您可以在http://westerveld.name/php-openid//

看到演示
  

会话可以由客户更改   操作?如果没有,我可以设置静态   会话并在没有使用它们   验证

客户端无法更改它,但黑客可能会窃取用户会话。您需要阻止session-fixation => session_regenerate_id

  

我应该如何管理我的用户   帐户?

你可能不应该这样做,因为你犯了错误的改变是大的。但下面是一些快速提示:

  • 您应该使用phpass将密码存储在数据库中。因为我确实注意到您没有使用key stretching 。您应该执行基准测试,如果您可以快速生成哈希值,那么您肯定无法安全地保护密码。 Bcrypt非常适合散列(由phpass使用。你应该使用该库),因为它是摩尔定律的证明。
  • 保护您的用户免遭CSRF
  • 您应该阅读the OWASP top 10

我还创建了一个小authentication library,只是为了它的乐趣。我认为这是非常安全的,尽管例如logout.php仍然容易受到CSRF的影响,尽管这不是一个大问题(修复非常简单)。