raicoo2k
Grünschnabel
Hallo,
ich habe mich heute das erste mal mit PHP-Klassen beschäftigt und wollte wissen ob das was ich gemacht habe richtig ist. Bisher habe ich nur mein altes Login als "Klasse" geschrieben (nicht fertig).
Für jeden Tip und Verbesserungsvorschlag wäre ich dankbar.
Hier mal mein Versuch:
Und das hier ist bei der Login eingebunden:
LG
Daniel
ich habe mich heute das erste mal mit PHP-Klassen beschäftigt und wollte wissen ob das was ich gemacht habe richtig ist. Bisher habe ich nur mein altes Login als "Klasse" geschrieben (nicht fertig).
Für jeden Tip und Verbesserungsvorschlag wäre ich dankbar.
Hier mal mein Versuch:
PHP:
class UserManagement
{
require_once dirname(__FILE__).'/engine/config.php';
require_once dirname(__FILE__).'/engine/func.php';
private $db;
public $Id;
public $Username;
private $Password;
private $Ip;
public $Email;
private $Fingerprint;
private $Salt;
private $Token;
public function __construct()
{
require_once dirname(__FILE__).'/engine/class.mysqli.php';
$this->db = new MysqliDb (MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE);
}
public function getIP()
{
$IpClient = (isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : NULL);
$IpForward = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : NULL);
$IpRemote = (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL);
if(filter_var($IpClient, FILTER_VALIDATE_IP))
{
$this->Ip = $IpClient;
} else if(filter_var($IpForward, FILTER_VALIDATE_IP)) {
$this->Ip = $IpForward;
} else {
$this->Ip = $IpRemote;
}
return $this->Ip;
}
public function Login($LoginUsername, $LoginPassword, $LoginToken)
{
$this->Username = $LoginUsername;
$this->Password = $LoginPassword;
$this->Token = $LoginToken;
session_regenerate_id();
// Leitet vom Login gesperrten User zurück
$this->db->where('ip', $this->getIP());
$Attempt = $this->db->getOne('login_attempts', 'count(ip) AS cnt');
$Attempt_Counter = $this->db->count;
if($Attempt['cnt'] >= MAX_LOGIN_ATTEMPTS)
{
$Subject = 'Achtung: Mehrfach fehlerhafter Loginversuch';
$Body = '123 Test';
// Benachrichtigt User per E-Mail bei fehlgeschlagenem Login
sendmail('testmail@trashmail.com', $Subject, $Body);
header('Location: enter.php?error=max_attempts');
exit;
}
// Salt wird aus der Datenbank geholt
$this->db->where('username', $LoginUsername);
$GetSalt = $this->db->getOne('members', 'salt');
// Prüft ob das Passwort zum Usernamen stimmt
$this->db->where('username', $LoginUsername);
$this->db->where('password', hash('sha512', $LoginPassword.$GetSalt['salt']));
$Check = $this->db->getOne('members', 'id');
$IsUser = $this->db->count;
if($this->db->count == 1 && $LoginToken == $_SESSION['login_token'])
{
// Legt die aktuelle IP und ein Fingerabdruck in die Datenbank ab
$Data = array(
'ip' => $this->getIP(),
'fingerprint' => md5(microtime(true).$_SERVER['HTTP_USER_AGENT'].$this->getIP())
);
$this->db->where('id', $Check['id']);
$this->db->update('members', $Data);
// Setzt ein Fingerabdruck
$_SESSION['fingerprint'] = md5(microtime(true).$_SERVER['HTTP_USER_AGENT'].$this->getIP());
$_SESSION['valid_login'] = '1';
// Löscht fehlgeschlagene Login-Versuche nach erfolgreichem Login
$this->db->where('ip', $this->getIP());
$this->db->delete('login_attempts');
// Weiterleitung wenn der Login erfolgreich war
header('Location: index.php');
} else {
// Löscht alle Sessions bei falschem Login
$_SESSION = array();
if($LoginUsername == TRUE)
{
// Loggt falschen Login, um Angreifer zu sperren
$Data = array(
'ip' => $this->getIP(),
'time' => time(),
'username' => $LoginUsername
);
$this->db->insert('login_attempts', $Data);
}
// Bei falschem Login wieder auf die Login-Seite weiterleiten
header('Location: enter.php?action=login_failed');
exit;
}
return $IsUser;
}
}
Und das hier ist bei der Login eingebunden:
PHP:
if(string_get('action') == 'login')
{
$Login = New UserManagement();
$Login->Login(string_post('username'), string_post('password'), string_post('login_token'));
}
LG
Daniel