Hallo,
ich habe folgendes Anliegen, nämlich dass jemand über meinen Code schaut, ob ich Fehler zur Sicherheit gemacht habe.
Es geht hierbei um die Erweiterung einer bestehenden Website im privaten Bereich. Technisch gesehen schreibe ich beim Login die Session ID, den Benutzernamen, Timestamp, Active (0/1) in eine Datenbanktabelle (mySQL). Bein Aufruf der Erweiterung wird geprüft, ob der Session Cookie gesetzt ist (wird ausgelesen und mit den in der DB Gespeicherten verglichen), ob Session ID in der Tabelle vorhanden ist und active = 1 ist. Ist das der Fall folgt User abhängige Ausgabe. Weiterhin läuft ein Cronjob der alle 15 min prüft ob die Sessions älter als 60min sind und setzt dann den Status active auf 0. Ich habe vor den Code noch so zu erweitern, dass der DB Eintrag bei jedem Seitenaufruf erneuert wird (Timestamp), damit der Benutzer nicht einfach so ausgeloggt wird. Der Cronjob dient hierzu nur wenn der Browser geschlossen wurde und die Session über den Logout nicht abgemeldet wurde. Um 01:00 läuft ein Job der alle Einträge mit active = 0 in eine Archiv-Tabelle verschiebt. Die config.php wird nachher außerhalb des Webroots aufbewahrt.
Hier schreibe ich die Sessiondetails in die Datenbank: (Code ist nach dem Login und vor dem Redirect)
Das ist der Code der Erweiterung:
Die einzige Schwachstelle, die ich sehe, ist das Session Cookie im Falle von Hijacking.
ich habe folgendes Anliegen, nämlich dass jemand über meinen Code schaut, ob ich Fehler zur Sicherheit gemacht habe.
Es geht hierbei um die Erweiterung einer bestehenden Website im privaten Bereich. Technisch gesehen schreibe ich beim Login die Session ID, den Benutzernamen, Timestamp, Active (0/1) in eine Datenbanktabelle (mySQL). Bein Aufruf der Erweiterung wird geprüft, ob der Session Cookie gesetzt ist (wird ausgelesen und mit den in der DB Gespeicherten verglichen), ob Session ID in der Tabelle vorhanden ist und active = 1 ist. Ist das der Fall folgt User abhängige Ausgabe. Weiterhin läuft ein Cronjob der alle 15 min prüft ob die Sessions älter als 60min sind und setzt dann den Status active auf 0. Ich habe vor den Code noch so zu erweitern, dass der DB Eintrag bei jedem Seitenaufruf erneuert wird (Timestamp), damit der Benutzer nicht einfach so ausgeloggt wird. Der Cronjob dient hierzu nur wenn der Browser geschlossen wurde und die Session über den Logout nicht abgemeldet wurde. Um 01:00 läuft ein Job der alle Einträge mit active = 0 in eine Archiv-Tabelle verschiebt. Die config.php wird nachher außerhalb des Webroots aufbewahrt.
Hier schreibe ich die Sessiondetails in die Datenbank: (Code ist nach dem Login und vor dem Redirect)
PHP:
if($this->userIsLoggedIn)
{
// DB Logindaten holen und in db_link packen
require_once("config.php");
$db_link = mysqli_connect(MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT, MYSQL_DATENBANK);
// Variablen
date_default_timezone_set("Europe/Berlin");
$session_id = $this->frontendController->fe_user->id;
$uid = $this->frontendController->fe_user->user["uid"];
$username = $this->frontendController->fe_user->user["username"];
$in_timestamp_unix = time();
$in_timestamp_date = date("d/m/Y H:i:s");
$out_timestamp_unix = "";
$out_timestamp_date = "";
$active = 1;
// SQL Statement prepared, da das Session Cookie in jedem Fall gelesen wird (sofern vorhanden), unabhängig vom
Inhalt: SQL Injection
$stmt = $db_link->prepare('INSERT INTO fe_users_currloggedin(session_id, uid, username, in_timestamp_unix,
in_timestamp_date, out_timestamp_unix, out_timestamp_date, active) VALUES(?,?,?,?,?,?,?,?)');
$stmt->bind_param('sisssssi', $session_id, $uid, $username, $in_timestamp_unix, $in_timestamp_date,
$out_timestamp_unix, $out_timestamp_date, $active);
$stmt->execute();
$stmt->close();
}else
{
// DB Logindaten holen und in db_link packen
require_once("config.php");
$db_link = mysqli_connect(MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT, MYSQL_DATENBANK);
// Variablen
$session_id = $this->frontendController->fe_user->id;
$active = 0;
$out_timestamp_unix = time();
$out_timestamp_date = date("d/m/Y H:i:s");
// SQL Statement prepared, da das Session Cookie in jedem Fall gelesen wird (sofern vorhanden), unabhängig vom
Inhalt: SQL Injection
$stmt = $db_link->prepare('UPDATE fe_users_currloggedin SET active=?, out_timestamp_unix=?,
out_timestamp_date=? WHERE session_id=?');
$stmt->bind_param("isss", $active, $out_timestamp_unix, $out_timestamp_date, $session_id);
$stmt->execute();
$stmt->close();
}
Das ist der Code der Erweiterung:
PHP:
if(isset($_COOKIE["fe_typo_user"])) // prüfen, ob Cookie gesetzt
{
$session_id = $_COOKIE["fe_typo_user"]; // Cookie-Value auslesen
// DB Logindaten holen und in db_link packen
require_once("config.php");
$db_link = mysqli_connect(MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT, MYSQL_DATENBANK);
// SELECT Abfrage, um Session ID prüfen zu können
$sql = "SELECT session_id,username,active FROM fe_users_currloggedin";
$db_erg = mysqli_query($db_link, $sql);
while ($zeile = mysqli_fetch_array($db_erg))
{
// wenn Session ID existiert und active = 1, dann Usernamen aus DB lesen
if(strcasecmp($zeile["session_id"], $session_id) == 0 && $zeile["active"] == 1)
{
$username = $zeile["username"];
break;
}
}
if(!empty($username)) // prüfen, ob Username-Variable existent (wenn nicht ist DB Abfrage schiefgegangen)
{
echo "Successfully logged in.<br>";
echo "Welcome ".$username;
// MORE CODE HERE
}
}
else
{
echo "You need to login";
}
Die einzige Schwachstelle, die ich sehe, ist das Session Cookie im Falle von Hijacking.
Zuletzt bearbeitet: