dedlfix: Ist mein Login System sicher genug

Beitrag lesen

echo $begrüßung;

$c=mysql_connect($host,$user,$pw);
mysql_select_db('name',$c);

Connect-Anforderungen können auch dann misslingen, wenn die übergebenen Daten richtig sind. Zum Beispiel dann, wenn der Server grad nicht verfügbar ist. Diesen Fehler solltest du ebenso berücksichtigen wie den Rückgabewert von mysql_select_db().

if(!$_POST['user']||$_POST['user']=='') {
  header('Location: index.php?show=blank&action=lfailed&err=nonen');
}

Vermutlich möchtest du, dass an dieser Stelle das Script nicht weiter verarbeitet wird. Du solltest es definiert beenden.

elseif(!$_POST['pw']||$_POST['pw']=='') {

Das else ist überflüssig, da du auf jeden Fall nur bei einer nicht erfolgreichen Prüfung hier vorbeikommst.

header('Location: index.php?show=blank&action=lfailed&err=nopen');
}

Auch hier fehlt vermutlich wieder ein die() oder exit.

$nick=$_POST['user'];
$pw=$_POST['pw'];

Man kann mit den Werten in $_POST auch direkt weiterarbeiten. Das Anlegen neuer Variablen ist nicht erforderlich.

$query="
SELECT user,pwd,xxxxxx,userid FROM xxx1 WHERE user='$nick'
";

Was passiert, wenn ich ' OR 1 OR ' (inklusive der ' ) eingebe? Und wo wird das Passwort überprüft? Auch im weiteren Verlauf kann ich eine Prüfung nicht finden.

$num=mysql_query($query,$c) or die (mysql_error());

Was will der Anwender im Fehlerfall mit dem genauen Wortlaut der MySQL-Fehlermeldung? Was hat es für ihn für einen Nutzen, wenn das Script an dieser Stelle stirbt? Den Fehlerfall kann der Anwender auch absichtlich provozieren, indem er etwas eingibt, das zu einem Syntax-Fehler des SQL-Statements führt. Ich sehe keine Gegenmaßnahmen in deinem Script (Stichwort mysql_real_escape_string())

$row = mysql_fetch_array($num);

Was ist, wenn bei der Abfrage kein Ergebnisdatensatz ermittelt werden konnte?

$r_name = $row["user"];

$row ist dann false und kein Array mit den Elementen, auf die du hier zugreifen willst. Das gäbe schöne Notice-Meldungen, wenn du sie dir durch ein auf E_ALL gestelltes error_reporting anzeigen ließest. Du hast doch sicher mal dein Script mit falschen Usernamen und Passwörtern malträtiert?

Beim Login Formular werden nur folgende Zeichen zugelassen:
0-9,a-z,A-Z,_,-

Solch eine Prüfung habe ich in deinem Code nicht gesehen. Da man sie auf mehrere Arten realisieren kann (Pseudo-Prüfung mit Javascript, Prüfung auf dem Server) kann ich so nicht sagen, wie hilfreich sie ist.

Das ganez Funktioniert. Aber ist es sicher genug?

Definiere "sicher genug". Sicher genug wogegen? Lege fest, was passieren darf und was nicht passieren darf. Wenn du dir nicht sicher bist, stell uns diese Liste vor und lass sie dir von uns auseinandernehmen.

Was kann ich noch tun?

Füttere dein Script mit allem möglichen sinnvollen und unsinnigen Zeichen und Werten und schau, ob es dann immer noch fehlerfrei funktioniert.

echo "$verabschiedung $name";