Login System sicher genug?

Kalma

Erfahrenes Mitglied
Hallo,

ich habe mal ein Login-System was auf Sicherheit achten soll.

Ich habe es hier mal gepostet und wollte wissen, wie ihr es findet:
PHP:
<?php
	require_once 'config.inc.php';

	$submit			= (isset($_POST['check_login'])) ? true : false;
	$machine		= (isset($_POST['check_machine'])) && (!empty($_POST['check_machine'])) ? true : false;

	if($submit == true && $machine == false) {
		$nickname	= (isset($_POST['nickname'])) && (!empty($_POST['nickname'])) ? $_POST['nickname'] : false;
		$passwort	= (isset($_POST['passwort'])) && (!empty($_POST['passwort'])) ? $_POST['passwort'] : false;
		$save_login	= (isset($_POST['save_login'])) && ($_POST['save_login'] == true) ? true : false;

		if($nickname == false) {
			// Benutzer hat das Feld "Nickname" nicht ausgefüllt
			header('Location: login_form.php?error=1&no_nickname=1');
			exit;
		}
		if($passwort == false) {
			// Benutzer hat das Feld "Passwort" nicht ausgefüllt
			header('Location: login_form.php?error=1&no_password=1');
			exit;
		}

		// Verschlüsseltes Passwort erstellen
		$hash_passwort		= sha1($passwort);

		// Benutzer suchen
		$find_user			=	'SELECT
									*
								FROM
									user
								WHERE
									`user_nickname`		= "'.mysql_real_escape_string($nickname).'"
								LIMIT
									1';
		$find_user_result	= @mysql_query($find_user);
		$find_user_count	= mysql_num_rows($find_user_result);

		if($find_user_count == 0) {
			// Es wurde kein Benutzer mit dem Nickname
			// $nickname gefunden
			// Weiterleitung zur login_form.php
			header('Location: login_form.php?error=1&no_user_found=1');
			exit;
		} else {
			// Es wurde ein Benutzer gefunden
			// Prüfen, ob dieser Aktiv ist
			$check_user		= mysql_fetch_array($find_user_result);
			$user_aktiv		= $check_user['user_aktiv'];
			$user_passwort	= $check_user['user_passwort'];

			if($user_aktiv == 0) {
				// User ist nicht aktiv
				// Weiterleitung zur login_form.php
				header('Location: login_form.php?error=1&user_not_active=1');
				exit;
			} else {
				// Benutzer ist aktiv
				// Passwort prüfen
				if($user_passwort != mysql_real_escape_string($hash_passwort)) {
					// Passwort ist nicht korrekt
					// Weiterleitung zur login_form.php
					header('Location: login_form.php?error=1&wrong_password=1');
					exit;
				} else {
					// Passwort ist korrekt
					// Benutzer kann eingeloggt werden
					// BenutzerInformationen auslesen
					$id						= $check_user['user_id'];
					$nickname				= $check_user['user_nickname'];
					$email					= $check_user['user_email'];
					$login_time				= time();

					// In Sessions schreiben
					$_SESSION['user_id']		= $id;
					$_SESSION['user_nickname']	= $nickname;
					$_SESSION['user_email']		= $email;
					$_SESSION['login_time']		= $login_time;

					// Will der User eingeloggt bleiben?
					if($save_login == true) {
						// User möchte für 30 TAGE eingeloggt bleiben
						setcookie('secure_login', $id, time()+3600 * 24 * 30);
					}

					// Weiterleitung zur Index.php
					header('Location: index.php?welcome=1');
					exit;
				}
			}
		}
	} else {
		// Benutzer hat nicht den Submit Button benutzt
		// Benutzer hat das hidden-Feld "check_machine" ausgefüllt
		// Weiterleitung zur login_form.php
		// Ausführung abbrechen
		header('Location: login_form.php');
		exit;
	}
?>

und die config.inc.php
PHP:
<?php
	error_reporting(E_ALL);
	session_start();

	$n			= "\n";

	// Was wird in Sessions gespeichert
	// UserID
	// UserNick
	// UserEmail
	// UserIP
	// Login Time

	// mySQL connect
	$host		= 'localhost';
	$user		= '***';
	$pass		= '***';
	$db			= '***';
	mysql_connect($host, $user, $pass, $db);
	mysql_select_db($db);

	// Maximale Sitzungszeit
	// 3 Stunden
	define('SESSION_LIFE', 60*60*3);

	// Prüfen, ob ein User den AutoLogin aktiviert hat
	$cookie	= isset($_COOKIE['secure_login']) ? $_COOKIE['secure_login'] : false;
	if((isset($cookie)) && (!empty($cookie)) && (is_numeric($cookie)) && (!isset($_SESSION['user_id'])) || (empty($_SESSION['user_id']))) {
		// Benutzer suchen
		$find_user			=	'SELECT
									*
								FROM
									user
								WHERE
									`user_id`	= "'.mysql_real_escape_string($cookie).'"
								LIMIT
									1';
		$find_user_result	= @mysql_query($find_user);
		$find_user_count	= mysql_num_rows($find_user_result);
	
		if($find_user_count == 1) {
			// Es wurde ein Benutzer gefunden
			// Prüfen, ob dieser Aktiv ist
			$check_user		= mysql_fetch_array($find_user_result);
			$user_aktiv		= $check_user['user_aktiv'];

			if($user_aktiv == 0) {
				// User ist nicht aktiv
				// Weiterleitung zur login_form.php
				header('Location: login_form.php?error=1&user_not_active=1');
				exit;
			} else {
				// Benutzer ist aktiv
				// Benutzer kann eingeloggt werden
				// BenutzerInformationen auslesen
				$id						= $check_user['user_id'];
				$nickname				= $check_user['user_nickname'];
				$email					= $check_user['user_email'];
				$login_time				= time();

				// In Sessions schreiben
				$_SESSION['user_id']		= $id;
				$_SESSION['user_nickname']	= $nickname;
				$_SESSION['user_email']		= $email;
				$_SESSION['login_time']		= $login_time;

				// Weiterleitung zur Index.php
				header('Location: index.php?welcome=1');
				exit;
			}
		}
	}
	

	function clear_sessions()
	{
		$_SESSION['user_id']		= '';
		$_SESSION['user_ip']		= '';
		$_SESSION['user_nickname']	= '';
		$_SESSION['login_time']		= '';

		// Session stoppen
		session_destroy();
	}

	// Prüfen, ob User eingeloggt ist
	function checkuser()
	{
		if((!isset($_SESSION['user_id'])) || (empty($_SESSION['user_id'])) || (!is_numeric($_SESSION['user_id']))) {
			// User ist nicht eingeloggt
			// User ist eingeloggt, $_SESSION['user_id'] hat keinen Wert, leer
			// $_SESSION['user_id'] besitzt einen Wert, der nicht numerisch ist.
			// Weiterleitung zum Login Formular
			// Ausführung abbrechen
			header('Location: login_form.php?error=1&not_logged_in=1');
			clear_sessions();
			exit;
		} else {
			if((!isset($_SESSION['user_ip'])) || (empty($_SESSION['user_ip']))) {
				// $_SESSION['user_ip'] existiert nicht
				// $_SESSION['user_ip'] ist leer
				// IP zuweisen
				$_SESSION['user_ip']	= $_SERVER['REMOTE_ADDR'];
			}

			if((!isset($_SESSION['user_nickname'])) || (empty($_SESSION['user_nickname']))) {
				// User ist nicht eingeloggt
				// User ist eingeloggt, $_SESSION['user_nickname'] hat keinen Wert, leer
				// Weiterleitung zum Login Formular
				// Ausführung abbrechen
				header('Location: login_form.php?error=1&not_logged_in=1');
				clear_sessions();
				exit;
			}
		}

		if((!isset($_SESSION['login_time'])) || (empty($_SESSION['login_time'])) || (time() > ($_SESSION['login_time']+SESSION_LIFE))) {
			// Loginzeit von $session_life_time ist abgelaufen
			// User wird automatisch ausgeloggt
			header('Location: login_form.php?error=1&login_time=1');
			clear_sessions();
			exit;
		}
	}
?>


Danke
mfG
David
 
Jep ist sicher ;)
Persönlich finde ich es nur zu viel Aufwand jedes mal den Code von Hand zu schreiben, lager doch teile davon in Klassen aus (weniger Code-Duplizierung) oder schau dir zB beim Zend-Framework die Validate-Klasse an, ist einfach supi und erspart sehr viel Code
 
Auf den ersten Blick schätze ich, dass bloß eine gültige Benutzer-ID als „secure_login“-Cookiewert angegeben werden muss und schon akzeptiert das Skript einen als den jeweiligen Benutzer.
 
Hab mal kurz einen blick drauf geworfen. Was ich da seh sind viele prüfungen ohne wirklichen nutzen. Der die Sicherheit erhöhen könnte.

Mfg Splasch
 
Wie ist das eigentlich beim AutoLogin?

Wenn man einfach nur die ID des Benutzers eingeben muss, kann doch jeder einfach die ID eines anderen Benutzers in dem Cookie speichern, oder nicht?
 
So ist es eben dann ganz leicht den acount von jemad fremden zu übernehmen.
Und das wegen auto login das ist sowie so ein hohes Sicherheitsrisiko am besten die funktion garnicht bieten.

Mir ist nix sicheres bei autologin bekannt.

Mfg Splasch
 
Die ID zu verschlüsseln würde es auch nicht bringen, oder?


Oder würdet ihr den AutoLogin rausnehmen?
 
Nein weil man die cokies von anderen Rechnern auslesen kann.
Das einzige was da etwas mehr Sicherheit bringen würde ist einen Dynamische ID.
Die verschlüsselt wird und sich ständig ändert.

So können dann nie 2 gleiche User eingelogt sein den es würden sich dann beide user gegenseitig rausschmeissen.

Mfg Splasch
 
Zuletzt bearbeitet:
Also verstehe ich dich richtig?

Eine weitere Spalte in der Datenbank, wo dieser Code dann gespeichert wird?

Und bei jedem Login diesen Wert ändern?
 
Zurück