Sicherer Login

PHP - alles Rund um die Programmierung von PHP und MySQL

Ist die geniale Programmiersprache, da sowohl für Einsteiger geeignet wie auch für Profis.

Moderator: lauras

Beiträge bitte im neuen Forum

Sicherer Login

Beitragvon Yamram » Samstag 14. Januar 2012, 15:55

Hallo Leute,
bei meinem aktuellen Projekt brauche ich ein sehr sicheres Loginsystem. Momentan sieht das Ganze ziemlich unsicher aus. Es gibt ein einfaches Formular, wo man Username und Passwort eingeben kann und dann versuchen, sich einzuloggen. Die Auswertung des Formulars habe ich in eine externe Datei names login.php gepackt. Wenn man login.php einfach so aufruft, dann wird man direkt auf index.php weitergeleitet, da man das Formular ja nicht ausgefüllt hat.

//Formular
Code: Alles auswählen
<form method="post" action="login.php">
<input title="Username" type="text" name="nickname" id="nickname" value="Username" onfocus="ClearLoginInput();" onfocusout="PutLoginInput();" maxlength="100" />
<input title="Passwort" type="password" name="password" id="password" value="" maxlength="100" />
<input type="submit" name="submit-login" value="einloggen" />
</form>


Fällt euch hier schon eine Sicherheitslücke auf? Also eigentlich kann man beim Formular ja nicht so viel falsch machen... Die Javascript-Funktionen sind dazu da das Attribut "value" zu manipulieren. Wenn man also das Inputfeld fokussiert, wird das value-Element geleert und wenn man es "ausfokussiert" dann wird es wieder mit "Username" gefüllt.


Nun kommen wir zum PHP-Teil. Wie ihr sehen könnt ist das action-Attribut des Formulars auf login.php gesetzt. Deswegen nun die komplette login.php.
Code: Alles auswählen

    session_start
();
    if(isset($_SESSION["c1l2o3u4d-userid"])) {                                                                //User ist schon angemeldet
        header("Location:index.php");
    }
    else {                                                                                                    //User ist noch nicht angemeldet
        if(!isset($_POST["submit-login"])) {
            header("Location:index.php");
        }
        else {
            if($_POST["nickname"] !== "" AND $_POST["password"] !== "") {                                    //Alles ist angegeben
                $connection = mysql_connect("localhost", "yamram-dev", "********");
                if (!mysql_select_db ("yamram-dev", $connection)) {  
                    header
("Location:index.php?error=2");
                }
                else {                                                                                        //LOGIN
                    echo "Username: ".$_POST["nickname"]."<br />";
                    $sql = "SELECT * FROM `user` WHERE `nickname` = '".$_POST["nickname"]."';";
                    $result = mysql_query($sql);
                    if(mysql_num_rows($result) == 1) {
                        while($row = mysql_fetch_row($result)) {
                            if(md5($_POST["password"]) == $row[2]) {
                                $sql = "INSERT INTO  `logs` (`id`, `nickname`, `logdate`) VALUES (NULL ,  '".$_POST["nickname"]."', CURRENT_TIMESTAMP)";
                                mysql_query($sql);
                                $_SESSION["c1l2o3u4d-userid"] = $row[0];
                                $_SESSION["c1l2o3u4d-username"] = $row[1];
                                header("Location:index.php?success=1");
                            }
                            else {
                                header("Location:index.php?error=4");
                            }
                        }
                    }
                    else {
                        header("Location:index.php?error=3");
                    }
                }
            }
            else {
                header("Location:index.php?error=1");
            }
        }
    }
 


Es funktioniert alles, aber ich glaube, es ist seeeeehr unsicher.
Ich denke mal, dass ihr den ganzen Code versteht. Denn er ist ziemlich simpel programmiert. Dazu möchte ich jetzt aber folendes von euch wissen:

  • Was kann ich allgemein besser machen?
  • Wie benutzt ich OOP? (Selber ist mir nichts eingefallen...)
  • Wie kann ich das Loginsystem sicherer machen?

Ich freue mich auf eure Antworten und verbleibe mit freundlichen Grüßen,
Philipp E.
Zuletzt geändert von Yamram am Samstag 14. Januar 2012, 18:53, insgesamt 1-mal geändert.
Benutzeravatar
Yamram
HTML-Sonderfall
 
Beiträge: 616
Registriert: Samstag 5. Februar 2011, 20:05
Wohnort: C:\Users\Yamram\Desktop\Papierkorb.ink

Re: Sicherer Login

Beitragvon drPHIP132 » Samstag 14. Januar 2012, 16:53

ist mir jetzt nix falsches aufgefallen.
du solltest übrigens die eingaben auf SQL injektion überprüfen, sowie alle TAG's aus den abgesendeten input-feldern filtern


Gruß
Phip
Benutzeravatar
drPHIP132
HTML-Acrobat
 
Beiträge: 744
Registriert: Samstag 15. Januar 2011, 19:10
Wohnort: Sachsen, Erzgebirge

Re: Sicherer Login

Beitragvon Yamram » Samstag 14. Januar 2012, 16:56

Wie meinst du das?
Benutzeravatar
Yamram
HTML-Sonderfall
 
Beiträge: 616
Registriert: Samstag 5. Februar 2011, 20:05
Wohnort: C:\Users\Yamram\Desktop\Papierkorb.ink

Re: Sicherer Login

Beitragvon drPHIP132 » Samstag 14. Januar 2012, 17:03

alle Variablen, die mit der SQL Anweisung in Verbindung kommen escapen lassen.

mysql_real_escape()
Benutzeravatar
drPHIP132
HTML-Acrobat
 
Beiträge: 744
Registriert: Samstag 15. Januar 2011, 19:10
Wohnort: Sachsen, Erzgebirge

Re: Sicherer Login

Beitragvon Yamram » Samstag 14. Januar 2012, 17:23

So, das habe ich eben gemacht. Hätte ich eigentlich auch vorher wissen können...

Code: Alles auswählen

<?php
    session_start
();
    if(isset($_SESSION["c1l2o3u4d-userid"])) {                                                                //User ist schon angemeldet
        header("Location:index.php");
    }
    else {                                                                                                    //User ist noch nicht angemeldet
        if(!isset($_POST["submit-login"])) {
            header("Location:index.php");
        }
        else {
            if($_POST["nickname"] !== "" AND $_POST["password"] !== "") {                                    //Alles ist angegeben
                $connection = mysql_connect("localhost", "yamram-dev", "********");
                if (!mysql_select_db ("yamram-dev", $connection)) {  
                    header
("Location:index.php?error=2");
                }
                else {                                                                                        //LOGIN
                    echo "Username: ".$_POST["nickname"]."<br />";
                    $sql = "SELECT * FROM `user` WHERE `nickname` = '".mysql_real_escape($_POST["nickname"])."';";
                    $result = mysql_query($sql);
                    if(mysql_num_rows($result) == 1) {
                        while($row = mysql_fetch_row($result)) {
                            if(md5($_POST["password"]) == $row[2]) {
                            
                                $sql 
= "INSERT INTO  `logs` (`id`, `nickname`, `logdate`) VALUES (NULL ,  '".mysql_real_escape($_POST["nickname"])."', CURRENT_TIMESTAMP)";
                                mysql_query($sql);
                                $_SESSION["c1l2o3u4d-userid"] = $row[0];
                                $_SESSION["c1l2o3u4d-username"] = $row[1];
                                header("Location:index.php?success=1");
                            }
                            else {
                                header("Location:index.php?error=4");
                            }
                        }
                    }
                    else {
                        header("Location:index.php?error=3");
                    }
                }
            }
            else {
                header("Location:index.php?error=1");
            }
        }
    }
?>
Zuletzt geändert von Yamram am Samstag 14. Januar 2012, 18:54, insgesamt 1-mal geändert.
Benutzeravatar
Yamram
HTML-Sonderfall
 
Beiträge: 616
Registriert: Samstag 5. Februar 2011, 20:05
Wohnort: C:\Users\Yamram\Desktop\Papierkorb.ink

Re: Sicherer Login

Beitragvon Yamram » Samstag 14. Januar 2012, 18:09

OK. Ich habe den Code in einigen Teilen aktualisiert:

Code: Alles auswählen

<?php
    session_start
();
    if(isset(
$_SESSION["c1l2o3u4d-userid"])) {                                                                //User ist schon angemeldet
        
header("Location:index.php");
    }
    else {                                                                                                    
//User ist noch nicht angemeldet
        
if(!isset($_POST["submit-login"])) {
            
header("Location:index.php");
        }
        else {
            if(
$_POST["nickname"] !== "" AND $_POST["password"] !== "") {                                    //Alles ist angegeben
                
$connection mysql_connect("localhost""yamram-dev""********");
                if (!
mysql_select_db ("yamram-dev"$connection)) {  
                    
header("Location:index.php?error=2");
                }
                else {                                                                                        
//LOGIN
                    
echo "Username: ".$_POST["nickname"]."<br />";
                    
$sql "SELECT * FROM `user` WHERE `nickname` = '".mysql_real_escape_string($_POST["nickname"])."';";
                    
$result mysql_query($sql);
                    if(
$row mysql_fetch_assoc($result)) {
                        if(
md5($_POST["password"]) == $row["password"]) {
                            
$sql "INSERT INTO  `logs` (`id`, `nickname`, `logdate`) VALUES (NULL ,  '".mysql_real_escape_string($_POST["nickname"])."', CURRENT_TIMESTAMP)";
                            
mysql_query($sql);
                            
$_SESSION["c1l2o3u4d-userid"] = $row["id"];
                            
$_SESSION["c1l2o3u4d-username"] = $row["nickname"];
                            
header("Location:index.php?success=1");
                        }
                        else {
                                
header("Location:index.php?error=4");
                        }
                    }
                    else {
                        
header("Location:index.php?error=3");
                    }
                }
                
mysql_close();
            }
            else {
                
header("Location:index.php?error=1");
            }
        }
    }
?>


Vorteile des neuen Codes:
  • kürzer (optimiert)
  • sicherer (mysql_real_escape_string())

Nun:


Was kann ich allgemein besser machen?
Wie benutzt ich OOP? (Selber ist mir nichts eingefallen...)
Wie kann ich das Loginsystem sicherer machen?
Zuletzt geändert von Yamram am Montag 16. Januar 2012, 18:00, insgesamt 1-mal geändert.
Benutzeravatar
Yamram
HTML-Sonderfall
 
Beiträge: 616
Registriert: Samstag 5. Februar 2011, 20:05
Wohnort: C:\Users\Yamram\Desktop\Papierkorb.ink

Re: Sicherer Login

Beitragvon webmaster3000 » Sonntag 15. Januar 2012, 14:31

Versuch mal, dich daran zu gewöhnen, den Code mit Syntax-Highlight zu versehen.

Nimm statt zig-mal
Code: Alles auswählen
else {
  if () {
    }
}
 

lieber
Code: Alles auswählen
elseif () {
}
 


zu OOP: Vielleicht kannst du eine Session-Klasse anlegen, die alle Daten (z. B. den Anmeldenamen) verwaltet?

Und guck dir mal den Thread zu [url]meinem Login-System[/url] an, ich bin sicher, mehrere genannten Punkte treffen auch auf dein Script zu.

Hoffe, ich konnte helfen,
webmaster3000
webmaster3000
HTML-Doctor
 
Beiträge: 257
Registriert: Donnerstag 29. September 2011, 16:32
Wohnort: Irgendwo in Thüringen

Re: Sicherer Login

Beitragvon Yamram » Sonntag 15. Januar 2012, 19:58

@webmaster3000:
Ey, das ist genial. Eigentlich ziemlich einfach zu merken, aber dafür doppelt so geil :) Danke :)

Das mit der OOP verstehe nicht. Wäre nett, wenn du das mal mehr erläutern könntest.

Der Link zu deinem Thread funktioniert irgendwie nicht :/
Benutzeravatar
Yamram
HTML-Sonderfall
 
Beiträge: 616
Registriert: Samstag 5. Februar 2011, 20:05
Wohnort: C:\Users\Yamram\Desktop\Papierkorb.ink

Re: Sicherer Login

Beitragvon Sören » Sonntag 15. Januar 2012, 22:18

In wie weit hast du denn schon Erfahrung mit OOP?
Die Grundlagen sind auch im PHP-Kurs erläutert.
Benutzeravatar
Sören
HTML-Acrobat
 
Beiträge: 851
Registriert: Samstag 5. Juni 2010, 16:00

Re: Sicherer Login

Beitragvon webmaster3000 » Montag 16. Januar 2012, 15:34

Yamram hat geschrieben:Der Link zu deinem Thread funktioniert irgendwie nicht :/

Ups, mein Fehler.
hier ist er
webmaster3000
HTML-Doctor
 
Beiträge: 257
Registriert: Donnerstag 29. September 2011, 16:32
Wohnort: Irgendwo in Thüringen

Re: Sicherer Login

Beitragvon Yamram » Montag 16. Januar 2012, 16:45

@Sören:
OOP habe ich zwar noch nie angewendet, deswegen fehlt mir wahrscheinlich die Praxis ;) Aber die Theorie habe ich ganz gut drauf :)

@webmaster3000:
Okay Danke. Daraus habe ich nun folgendes entnommen und dann etwas geändert. Um es Hackern, die Fehlermeldungen provozieren wollen, habe ich nun ganz oben

Code: Alles auswählen

error_reporting
(0);
 


eingebaut. Mehr habe ich jetzt eigentlich nicht gefunden.

Ich frage nochmal: Wie meinst du das mit der OOP? Wie soll ich OOP benutzen? Das habe ich nicht so ganz verstanden, sorry.
Benutzeravatar
Yamram
HTML-Sonderfall
 
Beiträge: 616
Registriert: Samstag 5. Februar 2011, 20:05
Wohnort: C:\Users\Yamram\Desktop\Papierkorb.ink

Re: Sicherer Login

Beitragvon webmaster3000 » Montag 16. Januar 2012, 17:05

webmaster3000 hat geschrieben:zu OOP: Vielleicht kannst du eine Session-Klasse anlegen, die alle Daten (z. B. den Anmeldenamen) verwaltet?

z. B.
Code: Alles auswählen
class mySession{
public function login($username,$passwd){
}

public function logout(){
}

private $username;
private $passwd;

private $loginTime;
webmaster3000
HTML-Doctor
 
Beiträge: 257
Registriert: Donnerstag 29. September 2011, 16:32
Wohnort: Irgendwo in Thüringen

Re: Sicherer Login

Beitragvon Yamram » Montag 16. Januar 2012, 17:08

Also, nur zum Verständnis:
Wenn das Formular abgeschickt wurde, habe ich ja drei Inputfelder: Nickname, Passwort und Bestätigung. Wenn Bestätigung gesetzt ist, dann übergebe ich
der Methode login() einfach den Nicknamen und das Passwort.

Falls das soweit richtig ist, dann hier meine erste Frage: Soll ich schon hier das Passwort verschlüsseln?

Dann überprüfe ich ihn der Methode alles mit MySQL, dies, das Ananas...


Ist das richtig? Oder wie lautet dein Vorschlag? Vorher hatte ich beide "Systeme" voneinander getrennt. Es gibt eine login.php und eine logout.php...
Benutzeravatar
Yamram
HTML-Sonderfall
 
Beiträge: 616
Registriert: Samstag 5. Februar 2011, 20:05
Wohnort: C:\Users\Yamram\Desktop\Papierkorb.ink

Frage zu Login Tutorial im Internet

Beitragvon yobas » Donnerstag 19. Januar 2012, 14:25

Hallo allerseits. ich möcht mich mal erkundigen ob diese tutorial auch etwas wert sind, sprich ob man diese auch so verwenden könnte / sind diese sachen was der Herr da redet auch sicher ?
Tutorial Part 1
Tutorial Part 2

oder sollte man die finger davon lassen ?
Benutzeravatar
yobas
HTML-Newbie
 
Beiträge: 79
Registriert: Dienstag 20. September 2011, 10:31

Re: Sicherer Login

Beitragvon drPHIP132 » Samstag 21. Januar 2012, 12:49

gefällt mir nicht. besonders weil der typ alte standarts á la <b> etc. verwendet und man daher schlussfolgern könnte, dass er nicht gerade so ahnung hat.
daher habe ich gleich aufgehört zu schauen.

mein tipp:
versuche du es selber und dann werden wir im forum das ding auf herz und nieren prüfen
Benutzeravatar
drPHIP132
HTML-Acrobat
 
Beiträge: 744
Registriert: Samstag 15. Januar 2011, 19:10
Wohnort: Sachsen, Erzgebirge

Nächste

Beiträge bitte im neuen Forum

Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron