Wie sicher ist dieser Passwortschutz?

Hallo!

Ich habe folgenden Login mit den folgenden Datein: (ohne Design)


<?php
$host = "-geändert-"; //Host
$user = "-geändert-"; //MySQL-Benutzername
$pass = "-geändert-"; //MySQL-Passwort
$db = "-geändert-"; //Datenbank
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Registrieren
</title>
</head>
<body>
<form action="register.php" method="post">
<fieldset>
<label for="name">
Gewünschter Benutzername:
</label>
<input type="text" name="name" id="name" />
<label for="pass">
Gewünschtes Passwort:
</label>
<input type="password" name="pass" id="pass" />
<input type="submit" value="Registrieren" />
</fieldset>
</form>
</body>
</html>
<?php

include("config.php");

$connection = mysql_connect ($host, $user, $pass);
mysql_select_db ($db, $connection);

$name = $_POST["name"];
$pass = md5($_POST["pass"]); //Passwort in verschlüsselter Form in die Datenbank speichern
$sql = "INSERT INTO benutzerdaten (id , name , pass) VALUES ( NULL ,'$name','$pass');";
mysql_query($sql);
die(header("location: formular_login.html")); //Benutzer zur Login-Seite weiterleiten
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Login
</title>
</head>
<body>
<form action="login.php" method="post">
<fieldset>
<label for="name">
Benutzername:
</label>
<input type="text" name="name" id="name" />
<label for="pass">
Passwort:
</label>
<input type="password" name="pass" id="pass" />
<input type="submit" value="Login"/>
</fieldset>
</form>
</body>
</html>
<?php
session_start(); //Session starten um Session-Variablen initialisieren zu können

include("config.php");

$connection = mysql_connect ($host, $user, $pass);
mysql_select_db ($db, $connection);
$name = $_POST["name"];
$pass = md5($_POST["pass"]);

$sql = "SELECT id, name FROM benutzerdaten WHERE (name = '$name' AND pass = '$pass');";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

if (mysql_num_rows($result)==1) {
$_SESSION["id"] = $row["id"];
$_SESSION["name"] = $row["name"];
die(header("location: member.php"));
}

else {
echo "Login fehlgeschlagen";
}

?>
<?php
session_start();

if (!isset($_SESSION["id"])||empty($_SESSION["id"])) {
die(header("location: formular_login.html"));
}

?>
<?php
include ("check.php");
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Mitglieder-Bereich
</title>
</head>
<body>
<p>
Dieser Bereich ist nur für Mitglieder sichtbar.
</p>
<p>
Ihre Benutzer-ID ist: <?php echo $_SESSION["id"];?> <br />
Ihr Benutername ist: <?php echo $_SESSION["name"];?>
</p>
<p>
<a href="logout.php">Logout</a>
</p>
</body>
</html>
<?php
session_start();
session_destroy();
header("location: formular_login.html");
?>


Das ist jetzt natürlich eine sehr vereinfachte Variante ohne ander Daten etc.

Wie sicher wäre so ein Login ohne Registrierung? Also sprich, Benutzernamen werden verschlüsselt gespeichert und für den Nutzer ist online nur der Loginbereich sichtbar.

Wie schwer wäre es für jemanden dieses System zu übergehen?
Kann man das irgentwie einschätzen?

lg
 
Moin

Ich sehe da keine ernsthaften Sicherheitsmassnahmen.

Stw. für deine Nachforschungen.
SQL-Injection, SALT, MD5 broken, Session-Hijacking

Sentrax
 
Gibt es auch nicht ;)

Ok danke für die Stichworte...werd mich einmal damit beschäftigen...darauf wollte ich hinaus :-)
 
Um den Login halbwegs abzusichern, solltest du auf MD5 verzichten und stattdessen SHA nutzen. Salt nicht vergessen. Weiterhin sollte natürlich die Webapp später prüfen können, ob ein User authentifiziert ist. Dazu reicht es nicht, dass in der Session nur die ID abgelegt wird. Dort sollte auch das Passwort-Hash liegen und mittels einer check_login()-Funktion geprüft werden, sobald der User Aktionen macht, die einen Login benötigen. Ausserdem sollte die Session auch eine Domain beinhalten, auf der sich der User authentifiziert hat. Und natürlich sein Username, mit dem er sich eingeloggt hat. Mittels dieser Daten kann eine check_login()-Funktion dann prüfen, ob der User tatsächlich eingeloggt ist oder nur vorgibt eingeloggt zu sein.

Im Optimalfall sollten die Daten aber nicht einfach im Klartext in der Session liegen sondern wiederum verschlüsselt sein. Und zwar so, dass nur die Webapp sie entschlüsseln kann (d.h. Key und Salt sind nur der Webapp bekannt und werden von dieser nur so lange gespeichert wie die Session existiert).

Weiterhin sollten, sofern der Webserver die Möglichkeit bietet, die MySQL-Zugangsdaten nicht im gleichen Verzeichnis liegen wie die Webapp sondern eine Ebene höher. Bei der Nutzung von MySQL sollte man auch beachten, dass die Builtin-Funktionen von PHP deprecated sind. Besser ist es MySQLi zu nutzen. Und dann natürlich User-Eingaben immer mit mysqli_real_escape_string() escapen. Sonst lassen sich allzu leicht MySQL-Statements unterschieben. Besser ist es explizit zu prüfen, ob die User-Eingaben überhaupt dem erwarteten Schema entsprechen und nicht etwa MySQL-Statements beinhalten.
 
Zurück
Oben