• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Login system sicher machen ?

BDG

Mitglied
Hallo Leute .
Wie ihr ich glaube alle wisst hab ich ja ein Login-system gemacht ... Und nur ist das nicht so sicher weil man müsste sich garnicht einloggen um auf die Seite des Users zu kommen man muss nur wissen wie sie heißt ... auf jede fall wollte ich wissen was ich da machen kann damit man es nicht hacken kann ... Hier sind die Codes :
registriren.html
HTML:
<html>
     <head>
  <title>Test...</title>
  </head>
  <body>
<form action="eintragen.php" method="post">
Dein Benutzername<br>
<input type="text" size="24" maxlength="50"
name="username"><br>
Dein Passwort<br>
<input type="text" size="24" maxlength="50"
name="passwort"><br>
Dein Name<br>
<input type="text" size="24" maxlength="50"
name="name"><br>
Dein NachName<br>
<input type="text" size="24" maxlength="50"
name="nachname"><br>
Deine E-mail Adresse<br>
<input type="text" size="24" maxlength="50"
name="email"><br>
<input type="submit" value="Registriren">
</form>
 
     </body>
</html>
so dann die registriren.php (naja in echt heißt sie eintragen.php) :lol:
PHP:
<?php
$username = $_POST['username'];
$passwort = $_POST['passwort'];
$name = $_POST['name'];
$nachname = $_POST['nachname'];
$email = $_POST['email'];
// Verbindung herstellen
$hostname = 'localhost';
$hostuser = 'root';
$hostpw = "";
$db = 'test';
$tabelle = 'user';
$verbindung = mysql_connect($hostname,$hostuser,$hostpw) or die (mysql_error());
mysql_select_db($db, $verbindung) or die (mysql_error());
$sqlbefehl="insert into `$tabelle`  (username,password,vorname,nachname,email) values  ('$username','$passwort','$name','$nachname','$email')";
mysql_query($sqlbefehl) or die(mysql_error());
mysql_close($verbindung);
?>
so dann die Login.html
HTML:
<html>
     <head>
  <title>Test...</title>
  </head>
  <body>
<form action="login.php" method="post">
Dein Username:<br>
<input type="text" size="24" maxlength="50"
name="username"><br><br>
Dein Passwort:<br>
<input type="password" size="24" maxlength="50"
name="password"><br>
<input type="submit" value="Login">
</form>
 
     </body>
</html>
Und die Login.php
PHP:
<?php 
$verbindung = mysql_connect("localhost", "root" , "") 
or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); 
mysql_select_db("test6") or die ("Datenbank konnte nicht ausgewählt werden"); 
$username = $_POST["username"]; 
$password = $_POST["password"]; 
$abfrage = "SELECT username, password FROM test6 WHERE username LIKE '$username' "; 
$ergebnis = mysql_query($abfrage) or die("Statement fehlerhaft: ".$sql);
$row = mysql_fetch_object ($ergebnis);
 
if($row->password == $password) 
    {  
    echo "Login erfolgreich. <br> <a href=\"geheim.php\">Geschützer Bereich</a>"; 
 echo "<br />eingeloggt als  $username";
    } 
else 
    { 
    echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; 
 echo "<br />Ihre eingegebenen Daten :   <br />Benutzername : $username<br />Passwort : $password ";
    } 
 
?>
Wie krig ich das nun sicher ohne viel aufwand ?
 
Du schreibst beim erfolgreichen Login in die Session, dass der Login erfolgreich war. Bei den Seiten, die nur als eingeloggter User aufgerufen werden können, prüfst du dann am Anfang, ob die Session gesetzt ist und einen gültigen Wert hat. Zusätzlich zu dem kannst du noch eine Datei für jeden User/für alle User anlegen und bei jedem Seitenaufruf prüfen, ob diese Datei bzw. der Eintrag in der Datei existiert, wenn die Session gesetzt ist.

Und was ich dir noch rate, ist, alle Benutzereingaben zu escapen.
 
ähhhhm und also ich kenne mich garnicht mit sessions aus ich hab das nur einmal gehört ... kannst du mir ein beispiel geben ? und wie escapet man benutzereingaben und was is das ?
 
also die tutorials hab ich mir mal angeguckt und auch noch gegooglet aber das war mir zu schwer das jetzt hinzukrigen wenn ich ne halbe stunde ein turorial angeguckt hab ... kann nicht jemand sagen was ich an den anfang der Seiten setzen muss ? bei Login und bei den Datein die nur für eingeloggte user sind ?
 
also die tutorials hab ich mir mal angeguckt und auch noch gegooglet aber das war mir zu schwer das jetzt hinzukrigen wenn ich ne halbe stunde ein turorial angeguckt hab ... kann nicht jemand sagen was ich an den anfang der Seiten setzen muss ?
Steht das nicht auf den verlinkten Seiten?
 
Oh man... Ich liebe es ja so sehr, wenn Menschen es zu eilig haben, sich Keine Zeit zu nehmen, um die gröbsten "Details" zu betrachten.

Im Groben:

Sessions beginnst du in PHP mittels
PHP:
session_start( );
Es darf keine Ausgabe vor dem Aufruf dieser Funktion stattfinden.

Darin speicherst du Daten "seitenübergreifend" beim Clienten ab, indem du auf das assoziative Array $_SESSION zugreifst:
PHP:
$_SESSION[ "Benutzername" ] = $Benutzername;
Auf deinen Seiten überprüfst du dann, ob $_SESSION[ "Benutzername" ] gesetzt ist. Falls nicht leitest du den Benutzer weiter zum Login, falls nötig. Auf besonders wichtigen Seiten, wenn nicht immer, prüfst du dann noch zusätzlich, ob der Benutzer wirklich existiert, denn Sessions kann man meines Wissens nach auch von Außen manipulieren... Da es ja Cookies beim Clienten sind. Natürlich kannst du auch noch andere Sicherheitsroutinen einbauen. Beim ändern von benutzerspezifischen Daten eine erneute Passwortabfrage, etc.

Zu guter letzt zerstörst du eine Session, also logst den Besucher aus, mit
PHP:
session_destroy( );
 
mysql injektionen sind warscheinlich das schlimmste was dir bei einem loginsystem passieren kann. grad weil du die e-mail adressen im klartext speichern musst.
passwörter solltest du als md5 speichern.
eine weitere gefahr geht von xss atacken aus. dabei musst du darauf achten, dass nicht nur sql injektionen verhindert werden, sondern auch die von javascript und html.
 
Auf besonders wichtigen Seiten, wenn nicht immer, prüfst du dann noch zusätzlich, ob der Benutzer wirklich existiert, denn Sessions kann man meines Wissens nach auch von Außen manipulieren... Da es ja Cookies beim Clienten sind.

Es ist eher so, dass die Daten auf dem Server gespeichert werden, der Client bekommt nur einen Cookie mit einem Hash-Code. Bei der Anfrage auf den Server wird der Hash-Code mitgeschickt und der Server gibt die zu dem Hash-Code gehörigen Daten preis. Die Wahrscheinlichkeit, dass du durch das Manipulieren des Hash-Codes auf einen anderen eingeloggten User stößt, ist relativ gering ^^
 
die frage ist aber: wo werden die daten gespeichert? ist es nicht so das sessions direkt im /tmp ordner gespeichert werden? ist es nicht so, dass es auf webservern wo mehrere auftritte liegen könnten, mehrere personen zugriff auf den /tmp ordner haben? was passiert nun, wenn jemand der auch einen auftritt auf dem webserver hat die sessions manipuliert (oder es einem einbrecher ermöglicht)?
 
Das ist (wie immer ;)) ein guter Einwand. Das Problem (edit: sofern es in einer gegebenen Konfiguration überhaupt besteht) lässt sich aber wohl durch Anpassen des session.save_path in den Griff bekommen. Den anzupassen, ist genau deshalb immer eine gute Idee.

- PHP: session_save_path - Manual

Grundsätzlich können Session-Daten nicht clientseitig modifiziert werden, wie es etwa bei Cookie-Daten der Fall ist. Weil sie serverseitig gespeichert werden, sind Session-Daten prinzipiell manipulationssicher (abgesehen von „Dateisystem“-Angriffen – also Ausnutzen unabhängiger Sicherheitslücken –, siehe freak131).

Das heißt allerdings nicht, dass die Anwendung selbst nicht noch irgendwie ungefilterte Benutzereingaben in die Sessions schreiben könnte. Zum Beispiel:

PHP:
// NICHT GUT
$_SESSION['user_id'] = $_POST['user_id'];

Die Felder in $_POST sind für den Nutzer beliebig modifizierbar.

: »Dumm programmieren kann man immer.«
 
Zuletzt bearbeitet:
Zurück
Oben