Sicheres Loginsystem?

campari

Erfahrenes Mitglied
Moin,

hab mir ein Loginverfahren überlegt, mit Inspiration durchs Forum, und wollt euch mal bitten drüberzuschaun, ob man das als sicher bezeichnen könnte.

Beim Anmelden wird das Passwort mit sha1 gehast. Wenn jemand das gehaste Passwort abfängt könnte er sich nicht einloggen, da das Passworteingabefeld nicht 40 Buchstaben erlaubt:

PHP:
?>
<script src="sha1.js" type="text/javascript"></script>
<script language="JavaScript" type="text/javascript"><!--
function login(f) {
	f['pssws'].value = hex_sha1(f['psswd'].value);
	f['psswd'].value = '';
	return true;
}
</script>
<?php 
echo "<form action='cookie_check.php' method='POST' onSubmit='return login(this);' name='formlog'>\n";
echo "<table><tr>";
echo "<td><input type='hidden' name='pssws' value=''></td>\n";
echo "<td>Benutzername :</td><td><input type='text' name ='nick' value ='' maxlength='30'></td>\n";
echo "<td>Passwort :</td><td><input type='password' name ='psswd'  maxlength='30'></td>\n"; 
echo "<tr><td><input type='submit' value='Anmelden' name='anm'></td>\n"; 
echo "</tr></table>\n";
echo "</form>\n";

Da AOL (evlt auch andere Provider) öfter die IP wecheln, dachte ich selber eine Art IP zu vergebe, in Form von dem Cookie "SessionID". Nach korrekter Ameldung wird also das Cookie "SessionID" erzeugt. So kann ich auf jeder Seite prüfen, ob noch immer der Benutzer xyz mit der erzeugten SessionID übereinstimmt:

cookie_check.php:
PHP:
$nick = $_POST['nick'];
$pssw = $_POST['pssws'];
// Datenbankabfrage
$sqla = "SELECT benutzer, psswd FROM $tbname WHERE benutzer='$nick' AND psswd='$pssw'";
$sqlb = mysql_query($sqla);
$sqlc = mysql_num_rows($sqlb);
if ($sqlc == 1) {
// Cookies setzen
setcookie('Benutzer', $nick);
$date = DATE(s.y.d.m);
$md5sess = md5($nick.$pssw.$date);
mysql_query("UPDATE $tbname SET idsess='$md5sess' WHERE benutzer='$nick'"); 
setcookie('SessionID', $md5sess); 
header ("Location: $url/index.php");
} else {
header ("Location: $url/index.php?f=1");
}


Macht das Login-Verfahren Sinn oder hab ich einen Denkfehler?

Chers
 
Was würde denn passieren wenn der Benutzer Cookies und JavaScript Deaktiviert hat?
Oder in seinem Cookie den Code ändert?

Ich weis ja nicht wie du die Cookies nachher verarbeitest.
 
Zuletzt bearbeitet:
Danke für den Link.
Ist geändert:

PHP:
"SELECT benutzer, psswd FROM $tbname WHERE benutzer='".mysql_real_escape_string($_POST['nick'])."' AND psswd='".mysql_real_escape_string($_POST['Benutzer'])."'"


Wegen Cookies und JS hab ich auch überlegt. Aber ich komme auf keinen grünen Zweig, ohne die beiden Einstellungen. Grossartig passieren wird nix, wenn man Cookies/JS deaktiviert hat. Der Login klappt dann einfach nicht.
Ausgelesen werden die Cookies ganz normal über $_COOKIE['cuser']
Und wenn man in seinem Cookie rumpunscht, stimmts ja nichtmehr mit dem DB-Eintrag überein, und der Login schlägt fehl.

Chers
 
Es sollten aber auf jeden Fall alternative Möglichkeiten geben ...
Du kannst nicht davon ausgehen, geschweige denn erwarten, dass auf einer öffentlich zugänglichen Seite jeder Cookies und Javascript aktiviert hat.
 
Ich seh das schon ein. Ok, auf JS kann ich verzichten. Werd dann eine Alternative ohne sha1-gehastes PW anbieten.
Aber ohne Cookies gait dat nich! Wie soll ich sonst auch nach der Anmeldung feststellen, dass der Client auch der ist, für den er sich ausgibt?
 
Zum Beispiel in dem du die Session ganz normal über die URL weitergibst?

Und sha1 gibt es auch bei PHP
sha1()
Sehe den Sinn und Zweck der Arbeit mit dem JavaScript sowieso nicht ganz ;)
 
Im Prinzip identifiziert sich der Client doch über den Loginname und das Passwort somit ist doch sichergestellt wer er ist. Oder liege ich da falsch?
Ich weis nicht ob sich die IP bei z.B. AOL ändert ohne das sich der User neu einwählt kanns mir aber nicht vorstellen somit sollte die Session doch reichen.
Ausserdem finde ich ist die Sicherheit doch eher dadurch gefärdet das man Sicherheitsrelevante Daten auf dem Rechner des Benutzers speichert die der Benutzer evtl selber verändern könnte.
 
Zum Beispiel in dem du die Session ganz normal über die URL weitergibst?
Dann kann jeder mit der URL sich einloggen.
Und sha1 gibt es auch bei PHP
sha1()
Sehe den Sinn und Zweck der Arbeit mit dem JavaScript sowieso nicht ganz ;)
Damit wird Client-seitig gehasht. Da der der Wert 40 Bit hat, das Passworteingabefeld aber nur 30 Zeichen zulässt, kann man ein "abgelauschtes" Passwort nicht eintragen.

Im Prinzip identifiziert sich der Client doch über den Loginname und das Passwort somit ist doch sichergestellt wer er ist. Oder liege ich da falsch?
Beim Login ja. Aber danach ist es nicht sichergestellt.
Ausserdem finde ich ist die Sicherheit doch eher dadurch gefärdet das man Sicherheitsrelevante Daten auf dem Rechner des Benutzers speichert die der Benutzer evtl selber verändern könnte.
Sind ja keine sicherheitsrel Daten. Nur eine SessioID, die der Benutzer ruihig ändern kann. Nur fliegt er dann sofort aus dem Login.

Ich meine ich liege richtig. Aber deswegen frag ich ja ;)
 
Dann kann jeder mit der URL sich einloggen.
Dagegen könntest du z. B. zusätzlich die IP in der Session eintragen (zusätzlich vielleicht noch einen Hash aus Browser, OS und allen Infos die einen Benutzer "unique" machen).
Damit wird Client-seitig gehasht. Da der der Wert 40 Bit hat, das Passworteingabefeld aber nur 30 Zeichen zulässt, kann man ein "abgelauschtes" Passwort nicht eintragen.
Gibt es wirklich Möglichkeiten ein Formular, dass auf sich selbst verweist abzuhören? Abgesehen von Phishing, etc.
 
Zurück