0

クラスを作成するのはこれが初めての試みです。

ログイン、登録、ログアウトを行う User クラスを作成しました。

動作しているように見えますが、何か間違ったことをしたと確信しています。たとえば、login() メソッドのみを使用する場合、___construct で作成したすべての変数を指定する必要があるのはなぜですか。ログインには、ユーザー名とパスワードのみが必要です。

テンプレート システムで $_ERROR 変数を使用してエラーを表示します。クラスでエラーを表示するにはどうすればよいですか。throw new ExampleException を使用しました

誰か私のクラスを見直して、私が犯した間違いを教えてください。クラスの使い方を知りたいだけ...

これは私のクラスです

<?php
class User
{

var $Username = '';
var $Email = '';
var $Password = '';
var $Salt = '';

protected $_username;
protected $_email;
protected $_password;
protected $_salt;

protected $_db;
protected $_user;

public function __construct(PDO $db, $Username, $Email, $Password, $Salt)
{
    $this->_db = $db;
    $this->_username = $Username;
    $this->_email = $Email;
    $this->_password = $Password;
    $this->_salt = $Salt;

}

private function saltString($Password) // Creates random string for password
{
    $Characters = 'PEcN0';
    $string = md5( $Password . $Characters );

    return $string;
}

public function login() // checks if CheckCredentials is true. if it's true it creates sessions
{
    $user = $this->_CheckCredentials();
    if($user){
        $this->_user = $user;
        $_SESSION['UserID'] = $user['UserID'];
        $_SESSION['Username'] = $user['Username'];
        $_SESSION['Level'] = $user['Level'];
        $_SESSION['Reputation'] = $user['Reputation'];
        return $user['UserID'];
    }
    return false;
}

public function register() // checks if addUser is true.
{
    $user = $this->_addUser();
    if($user){
        $this->createSession($user);    
    }
    return false;
}

public function _CheckCredentials() // checks password and username for login method
{
    $sql = $this->_db->query("SELECT * FROM users WHERE Username = '" . $this->_username . "'");

    if($sql->rowCount() > 0){
        $user = $sql->fetch(PDO::FETCH_ASSOC);
        $pass = $this->saltString($this->_password);
        if($pass == $user['Password']){
            $sql = $this->_db->query( "UPDATE users SET LastLogin = NOW() WHERE UserID = '" . $user['UserID'] . "'" );
            return $user;
        }
    }
    return false;
}

public function _addUser() // add user into database
{
    $sql = $this->_db->query( "SELECT * FROM users WHERE Username = '" . $this->_username . "' OR Email = '" . $this->_email . "'" );
    if($sql->rowCount()){
        $user = $sql->fetch(PDO::FETCH_ASSOC);
        if($user['Username'] == $this->_username){
            throw new ExampleException("This username was taken.");
        }else{
            throw new ExampleException("This e-mail address is being used.");
        }
    }else{
        $intert = $sql->query( "INSERT INTO users ( UserID, OauthUid, OauthProvider, Username, Password, Email, CookieKey, Level, Registered, LastLogin, Reputation, Contents )
        VALUES ( NULL, '". $UserID ."', '". $Provider ."', '" . $Username . "', '" . $Password . "', '" . $Email . "', '" . generateKey( 5 ) . "', '1', NOW(), NOW(), '0', '0')" );

        $UserID = $sql->lastInsertId();

        if($instert){
            $_SESSION['UserID'] = $UserID;
            $_SESSION['Username'] = $Username;
            $_SESSION['Level'] = '1';
        }
    }
    return false;

}

public function getUser()
{
    return $this->_username;
}

}
?> 

そして、これが私の使い方です...

<?php

if ( isset( $_POST['Username'] ) )
{
$Username =  trim( $_POST['Username'] );
$Password =  trim( $_POST['Password'] );

if ( !preg_match( '/^[a-z0-9_]+$/i', $Username ) )
    $_ERROR = 'bad username!';
else
{
    $UserClass = new User($dbc, $Username, $Email, $Password, $Salt);

    if($userid = $UserClass->login())
    {
        if ( isset( $_POST['Remember'] ) )
        {
            setcookie( 'UserID', $data['UserID'], time() + 31536000, '/', SITE );
            setcookie( 'PassHash', md5( $data['Password'] .     $data['CookieKey'] ), time() + 31536000, '/', SITE );
        }

        header( "Location: " . ( $_POST['Redirect'] != '' ? base64_decode(     $_POST['Redirect'] ): '/index.php' ) );
        die();
    }
    else
        $_ERROR = "Check your username or password!";
        $_INFO .= $_SESSION['UserID'];

}
}else{

$Reff = '';
if ( isset( $_SERVER['HTTP_REFERER'] ) )
$Reff = base64_encode( $_SERVER['HTTP_REFERER'] );

$_INFO .= $_SESSION['UserID'];
$_PAGE .= t_LoginForm( $Reff );


}

?>
4

1 に答える 1

1

常にプラスであるPDOを使用していますが、問題はパラメーターをバインドしていないことです。PDO の最大のメリットは、実際にパラメーターをバインドできることです。あなたの例では:

$sql->bindParam(':userid',$UserID);
$sql->bindParam(':provider',$Provider);

等々...............

私を怖がらせている2番目の部分は、パスワードのセキュリティについて読んだ場合、連結した$charactersというランダムなキー文字列だけでパスワードにmd5を使用していることです。その先生は...ただ...ただ...愚かです(率直に言って申し訳ありませんが、これは実際には大きな問題であり、クライアント/ユーザーに深刻な問題を引き起こす可能性があります)。

ここで、このBcrypt Libraryを試してください。それは2013年です。ソルトを使用したり、そうしている方法を使用したりしても、md5を使用しないでください。

 $Characters = 'PEcN0';
    $string = md5( $Password . $Characters );

    return $string;

独自の「暗号化/ハッシュ」方法を構築することは避け、コミュニティが信頼する方法を使用してください。

また、PDO 部分に戻ります。これを属性に追加することを忘れないでください。

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);

この投稿から何かを学んでいただければ幸いです。bindParam なしで PDO を使用しないでください。ソルトの有無にかかわらず、MD5 をまったく使用しないでください。Bcrypt Bcrypt Bcrypt Bcrypt Bcrypt。

于 2013-04-13T18:29:28.897 に答える