Guten Tag.
Ich bin noch relativ ein newbie was PHP angeht. Aus diesem Grund ist es für mich nicht so einfach zu erkennen ob diese lösung wirklich etwas taugt. Ist es möglich das sich jemand den Code meiner Loginklasse nach Sicherheitslücken checkt? Auch für Optimierungsvorschläge bin ich offen
Als Vorlage hab ich mir eine Klasse aus dem phpforum wiki genommen. Login-System / Authentifizierung - Forum: phpforum.de
Sie ist aber zum grössten Teil neu geschrieben.
Danke im voraus für Eure Antworten.
Grüsse
Hexagone
Ich bin noch relativ ein newbie was PHP angeht. Aus diesem Grund ist es für mich nicht so einfach zu erkennen ob diese lösung wirklich etwas taugt. Ist es möglich das sich jemand den Code meiner Loginklasse nach Sicherheitslücken checkt? Auch für Optimierungsvorschläge bin ich offen
Als Vorlage hab ich mir eine Klasse aus dem phpforum wiki genommen. Login-System / Authentifizierung - Forum: phpforum.de
Sie ist aber zum grössten Teil neu geschrieben.
Danke im voraus für Eure Antworten.
PHP-Code:
<?php
class Login {
private $mysql_hostname = '';
private $mysql_username = '';
private $mysql_password = '';
private $mysql_database = '';
private $dbLink;
private $falseUserData = 'Login fehlgeschlagen! Bitte überprüfen Sie Ihre Zugangsdaten! <a href="javascript:history.back(-1);">Zurück</a>';
public function __construct() {
$dbLink = new MySQLi($this->mysql_hostname, $this->mysql_username, $this->mysql_password, $this->mysql_database)
or die('Connection Error: ' . mysqli_error());
$this->dbLink = $dbLink;
return $dbLink;
}
public function valid() {
try {
if(!isset($_POST['login'])) {
return FALSE;
}else{
if (empty($_POST['username']) OR empty($_POST['password'])) {
throw new Exception($this->falseUserData);
} else {
return $this->is_logged_in();
}
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
private function is_logged_in() {
try {
if (isset($_POST['login'])) {
$username = addslashes(htmlentities($_POST['username']));
$password = hash('SHA512', $_POST['password']);
$sql = '
SELECT
id,
status
FROM account
WHERE
(username = ?)
AND
(pwHash = ?)
';
$stmt = $this->dbLink->prepare($sql);
$stmt->bind_param('ss',
$username,
$password
);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$stmt->bind_result(
$id,
$status
);
$stmt->fetch();
switch ($status) {
case 'active':
$_SESSION['username'] = $username;
$_SESSION['id'] = $id;
echo 'Sie wurden erfolgreich eingeloggt!<br /><a href="'.$_SERVER['PHP_SELF'].'">Weiter zur Seite</a>';
return TRUE;
break;
case 'block':
throw new Exception('Ihr Account wurde gesperrt!');
return FALSE;
break;
case 'inactive':
throw new Exception('Ihr Account ist momentan nicht aktiviert. Bitte bestätigen Sie Ihre Aktivierungs-Email!');
return FALSE;
default:
throw new Exception('Unbekannter Fehler!');
return FALSE;
break;
}
} elseif ($stmt->num_rows() < 1) {
throw new Exception($this->falseUserData);
return FALSE;
}
} else {
throw new Exception('Authifizierung erforderlich!');
return FALSE;
}
} catch(Exeptions $e) {
echo $e->getMessage();
}
}
public function logout() {
try {
if (isset($_SESSION['id'])) {
$_SESSION = array();
session_destroy();
session_regenerate_id();
unset($_SESSION);
echo 'Sie wurden abgemeldet';
return TRUE;
} else {
throw new Exception('Sie können sich nicht abmelden');
return FALSE;
}
} catch (Exception $e) {
echo $e->getMessage();
}
}
public function check_login() {
if (isset($_SESSION['id'])) {
return TRUE;
}
}
public function change_password($userID, $newPw) {
try {
if ($userID) {
$newPw = hash('SHA512' ,$newPw);
$sql = '
UPDATE account
SET pwHash = ?
WHERE id = ?
';
$stmt = $this->dbLink->prepare($sql);
$stmt->bind_param('ss',
$newPw,
$userID
);
$stmt->execute();
echo 'Passwort wurde erfolgreich geändert';
return TRUE;
} else {
throw new Excetion('Es war nicht möglich das Passwort zu ändern!');
return FALSE;
}
} catch(Exception $e) {
echo $e->getMessage();
}
}
public function ban_user($userID) {
try {
if(is_int($userID)) {
$status = 'block';
$sql = '
UPDATE account
SET status = ?
WHERE id = ?
';
$stmt = $this->dbLink->prepare($sql);
$stmt->bind_param('si',
$status,
$userID
);
$stmt->execute();
echo 'Benutzer '.$_SESSION['username'].' wurde für unbestimmte Zeit gebannt';
} else {
throw new Exception('Es ist ein Fehler aufgetreten! (banUser)');
}
} catch(Exception $e) {
echo $e->getMessage();
}
}
public function delete_user($userID) {
try {
if(is_int($userID)) {
$sql = '
DELETE FROM login
WHERE id = ?
';
$stmt = $this->dbLink->prepare($sql);
$stmt->bind_param('i',
$userID
);
$stmt->execute();
return TRUE;
} else {
throw new Exception('Es ist ein Fehler aufgetreten! (deleteUser)');
return FALSE;
}
} catch(Exception $e) {
echo $e->getMesage();
}
}
public function activate_user($activationHash) {
try{
//Daten richtig entschlüsseln (noch fehlerhaft)!!!!
$hashEmail = substr($activationHash, 0, 64);
$hashID = substr($activationHash, 64,11);
$sql = '
SELECT
id,
username,
email,
status
FROM account
WHERE id = ?
';
$stmt = $this->dbLink->prepare($sql);
$stmt->bind_param('i',
$hashID
);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result(
$userID,
$username,
$email,
$status
);
$stmt->fetch();
if(hash('SHA256', $email) == $hashEmail) {
if($status == 'inactive') {
$newStatus = 'active';
$updSql = '
UPDATE account
SET status = ?
WHERE id = ?;
';
$stmt = $this->dbLink->prepare($updSql);
$stmt->bind_param('ss',
$newStatus,
$userID
);
$stmt->execute();
return TRUE;
} else {
throw new Exception('Der Benutzer '.$username.' wurde bereits Aktiviert');
return FALSE;
}
} else {
throw new Exception('Ungültiger Aktivierungscode');
return FALSE;
}
} catch(Exception $e) {
echo $e->getMessage();
}
}
public function insert_user($newName, $newPw, $newEmail) {
try {
// überprüfung ob der Name oder die Email Adresse schon existieren um eine Fehlermeldung auszugeben
$selSql = '
SELECT id
FROM account
WHERE username = ?
';
$stmt = $this->dbLink->prepare($selSql);
$stmt->bind_param('s',
$newName
);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows() > 0) {
throw new Exception('Dieser Benutzername existiert bereits! Bitte wählen Sie einen anderen.');
} else {
$validEmail = trim(stripslashes(strtolower($newEmail)));
if(strstr($validEmail, '@') && strstr($validEmail, '.') && strlen($validEmail) >= 6) {
$newName = addslashes(htmlentities($newName));
$newPw = hash('SHA512', $newPw);
$status = 'inactive';
$insSql = '
INSERT INTO account
(
username,
pwHash,
email,
status
)
VALUES
(
?,
?,
?,
?
)
';
$stmt = $this->dbLink->prepare($insSql);
$stmt->bind_param('ssss',
$newName,
$newPw,
$newEmail,
$status
);
$stmt->execute();
$selSql = '
SELECT id
FROM account
WHERE username = ?
';
$stmt = $this->dbLink->prepare($selSql);
$stmt->bind_param('s',
$newName
);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result(
$userID
);
$stmt->fetch();
$activationHash = hash('SHA256', $newEmail).$userID;
$emailContent = 'Aktivierungslink für '.$newName.'<br /><a href="http://localhost/register.php?activationCode='.$activationHash.'>Aktivieren</a>';
$emailSubject = 'Aktivierung';
$emailRecipient = 'sgrossgl@gmail.com';
$emailHeader = 'FROM: Steve';
$sendEmail = @mail($validEmail, $emailSubject, $emailContent, $emailHeader);
if(!$sendEmail) {
throw new Exception('Es ist ein Fehler beim Absenden der Aktivierungsmail aufgetreten.');
return FALSE;
} else {
return TRUE;
}
} else {
throw new Exception('Die gewählte Mail-Adresse ist ungültig!');
}
}
} catch(Exception $e) {
echo $e->getMessage();
}
}
}
Hexagone
Kommentar