Hallo zusammen,
ich versuche ein 'sicheres' Login Script auf meiner Seite zum implementieren, weiß aber nicht genau was hier schief läuft.
Erstmal zum Script:
Index.php
processLogin.php
class.login.php
Wenn ich die Weiterleitung in 'processLogin.php' rausnehme und mir den Session Usernamen anzeige, wird dieser angezeigt.
Wenn ich dies auf der index.php versuche, gibt es die Variable '$_SESSION['username']' gar nicht?!
Wo ist hier der Denkfehler?
Danke im Voraus.
ich versuche ein 'sicheres' Login Script auf meiner Seite zum implementieren, weiß aber nicht genau was hier schief läuft.
Erstmal zum Script:
Index.php
PHP-Code:
<?php
// --- Includes ----
include_once 'include/pslConfig.php';
include_once('include/class.login.php');
// --- MySQL Connection aufbauen
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
// --- Secure Session starten
sec_session_start();
// --- Login Check
if (login_check($mysqli) == true) {
$logged = 'in';
} else {
$logged = 'out';
}
<form action="include/processLogin.php" id="" method="post" name="login_form">
<div class="row">
<div class="form-group">
<div class="col-md-12">
<label>E-mail Address</label>
<input type="text" value="" name="email" class="form-control input-lg">
</div>
</div>
</div>
<div class="row">
<div class="form-group">
<div class="col-md-12">
<a class="pull-right" id="headerRecover" href="?page=lostPassword">(Lost Password?)</a>
<label>Password</label>
<input type="password" value="" name="password" class="form-control input-lg">
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<span class="remember-box checkbox">
<label for="rememberme">
<input type="checkbox" id="rememberme" name="rememberme">Remember Me
</label>
</span>
</div>
<div class="col-md-6">
<input type="submit" value="Login" class="btn btn-primary pull-right push-bottom" data-loading-text="Loading..." onclick="formhash(this.form, this.form.password);"/>
</div>
</div>
</form>
?>
processLogin.php
PHP-Code:
<?php
// --- Includes
include_once 'pslConfig.php';
include_once 'class.login.php';
// --- MySQL Connection aufbauen
$mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
sec_session_start(); // Unsere selbstgemachte sichere Funktion um eine PHP-Sitzung zu starten.
if (isset($_POST['email'], $_POST['p'])) {
$email = $_POST['email'];
$password = $_POST['p']; // Das gehashte Passwort.
if (login($email, $password, $mysqli) == true) {
// Login erfolgreich
header('Location: ../index.php?page=main');
//echo htmlentities($_SESSION['username']);
} else {
// Login fehlgeschlagen
header('Location: ../index.php?page=main&error=1');
}
} else {
// Die korrekten POST-Variablen wurden nicht zu dieser Seite geschickt.
echo 'Invalid Request';
}
?>
class.login.php
PHP-Code:
<?php
function sec_session_start() {
$session_name = 'sec_session_id'; // vergib einen Sessionnamen
$secure = 'SECURE';
// Damit wird verhindert, dass JavaScript auf die session id zugreifen kann.
$httponly = true;
// Zwingt die Sessions nur Cookies zu benutzen.
if (ini_set('session.use_only_cookies', 1) === FALSE) {
header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
exit();
}
// Holt Cookie-Parameter.
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
// Setzt den Session-Name zu oben angegebenem.
session_name($session_name);
session_start(); // Startet die PHP-Sitzung
session_regenerate_id(); // Erneuert die Session, löscht die alte.
}
function login($email, $password, $mysqli) {
// Das Benutzen vorbereiteter Statements verhindert SQL-Injektion.
if ($stmt = $mysqli->prepare("SELECT MID, mUsername, mPassword, mSalt
FROM members
WHERE mEmail = ?
LIMIT 1")) {
$stmt->bind_param('s', $email); // Bind "$email" to parameter.
$stmt->execute(); // Führe die vorbereitete Anfrage aus.
$stmt->store_result();
// hole Variablen von result.
$stmt->bind_result($user_id, $username, $db_password, $salt);
$stmt->fetch();
// hash das Passwort mit dem eindeutigen salt.
$password = hash('sha512', $password . $salt);
if ($stmt->num_rows == 1) {
// Wenn es den Benutzer gibt, dann wird überprüft ob das Konto
// blockiert ist durch zu viele Login-Versuche
if (checkbrute($user_id, $mysqli) == true) {
// Konto ist blockiert
// Schicke E-Mail an Benutzer, dass Konto blockiert ist
return false;
} else {
// Überprüfe, ob das Passwort in der Datenbank mit dem vom
// Benutzer angegebenen übereinstimmt.
if ($db_password == $password) {
// Passwort ist korrekt!
// Hole den user-agent string des Benutzers.
$user_browser = $_SERVER['HTTP_USER_AGENT'];
// XSS-Schutz, denn eventuell wir der Wert gedruckt
$user_id = preg_replace("/[^0-9]+/", "", $user_id);
$_SESSION['user_id'] = $user_id;
// XSS-Schutz, denn eventuell wir der Wert gedruckt
$username = preg_replace("/[^a-zA-Z0-9_\-]+/",
"",
$username);
$_SESSION['username'] = $username;
$_SESSION['login_string'] = hash('sha512',
$password . $user_browser);
// Login erfolgreich.
return true;
} else {
// Passwort ist nicht korrekt
// Der Versuch wird in der Datenbank gespeichert
$now = time();
$mysqli->query("INSERT INTO login_attempts(lamid, laTime)
VALUES ('$user_id', '$now')");
return false;
}
}
} else {
//Es gibt keinen Benutzer.
return false;
}
}
}
Wenn ich dies auf der index.php versuche, gibt es die Variable '$_SESSION['username']' gar nicht?!
Wo ist hier der Denkfehler?
Danke im Voraus.
Kommentar