Ankündigung

Einklappen
Keine Ankündigung bisher.

Eigenes Login-Script

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Eigenes Login-Script

    Hallo zusammen,

    ich bin neu hier im Forum und beschäftige mich noch nicht sehr lange mit php. Das erste wirklich nützliche Skript, dass ich programmiert habe war jetzt ein Login.

    Meine Frage an die erfahrenen PHPler: Ist dieses Skript so in Ordnung oder gibt es irgendwelche groben Fehler die ich gemacht habe oder Sicherheitsaspekte die ich nicht beachtet habe?

    Danke für jeden Kommentar.
    mfg, daniel.


    login.php: Loginseite mit Überprüfung der Logindaten
    PHP-Code:
    <?php

    //Geschützter Bereich
    $safe_page "intern/index.php";

    //Session starten
    ini_set('session.use_only_cookies'1);
    session_set_cookie_params(1440);
    session_name("EBSESSID");    
    session_start();

    //Falls bereits eingeloggt
    if ($_SESSION['login'] == true) {
      
    header('Location: ' $safe_page);
      exit();
    }

    //Logindaten prüfen
    if (isset ($_POST['user_name'],$_POST['user_pass']) )
        {
         
    //Cookie prüfen
           
    if ($_COOKIE[session_name()] != session_id()) {
              
    $_SESSION = array();
              
    session_destroy();
              if (!isset(
    $_COOKIE[session_name()])) {
                
    header('Location: login.php?cookie=false');
              } else {
              
    header('Location: login.php');
              } 
              exit();
            }
            
            
    //Eingaben aus POST als Hash
            
    $user_name $_POST['user_name'];
            
    $user_hname hash('sha256'$user_name);
            
    $user_hpass hash('sha256'$_POST['user_pass']);
            
            
    //Username und Passwort aus Datenbank
            
    $dbarray file("userdb.dat");
            
    $user_found null;
            foreach(
    $dbarray as $user){
              
    $elemente explode("|",$user);
              if (
    $elemente[0] == $user_hname){
                
    $dbuser_hname $elemente[0];
                
    $dbuser_hpass $elemente[1];
                
    $user_found $elemente[2];
                }
              }  
            
            if (
    $user_hname == $dbuser_hname && $user_hpass == $dbuser_hpass && isset($user_found)){
                
    $_SESSION['login'] = true;
                
    $_SESSION['user_clearname'] = $user_found;
                
    $_SESSION['user_name'] = $user_name;
                
    header('Location: ' $safe_page);
            } else {
                
    //Login falsch
                
    $_SESSION['login'] = false;
                
    header('Location: login.php?valid=false');
            }
        }  else {
            if (
    $_GET['valid'] == 'false') { echo 'Benutzername oder Passwort falsch.<br />'; }
            if (
    $_GET['cookie'] == 'false') { echo 'Bitte Cookie akzeptieren.<br />'; }
            
    //Formular
            
    echo '<form action="login.php" method="post">';
            echo 
    'User Name: <input type="text" name="user_name"><br />';
            echo 
    'User Passwort: <input type="password" name="user_pass"><br />';
            echo 
    '<input type="submit" name="Submit" value="einloggen">';
            echo 
    '</form>';  
        }
    ?>
    logout.php: Skript auf das zum Logout verlinkt wird
    PHP-Code:
    <?php
      ini_set
    ('session.use_only_cookies'1);
      
    session_name("EBSESSID");    
      
    session_start();
      
    $_SESSION = array();
      
    setcookie(session_name(), ''time()-3600,'/');
      
    session_destroy();
      
    header('Location: login.php');
    ?>
    secure.php: Zur einbindung in jede Seite des gesperrten Bereiches (mit require() )
    PHP-Code:
    <?php
      ini_set
    ('session.use_only_cookies'1);
      
    session_name("EBSESSID");    
      
    session_start();
      if (
    $_SESSION['login'] != true) {
        
    header('Location: login.php');
        exit;
      }
    ?>

  • #2
    Ständig mittels header wild durch die Gegend zu leiten, finde ich persönlich ziemlich unsauber.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Zitat von ChrisB Beitrag anzeigen
      Ständig mittels header wild durch die Gegend zu leiten, finde ich persönlich ziemlich unsauber.
      Wie würde man das sinnvoller lösen?

      Kommentar


      • #4
        Direkte Fehlerausgabe oder Fehler sammeln und dann ausgeben zusammen mit dem Formular.
        Ggf. kannst du dies auch in eine funktion oder in eine "Authentifiezierungsklasse" kapseln!

        Kommentar


        • #5
          Wenn dein Script funktioniert und du dich nur mit bestimmten Usernamen anmelden kannst, ist dein Script in Ordnung.
          Zitat von ChrisB Beitrag anzeigen
          Ständig mittels header wild durch die Gegend zu leiten, finde ich persönlich ziemlich unsauber.
          eigentlich finde ich das nicht so schlimm, aber hier ist es ein bisschen zu übetrieben. Wie schon Papst gemeint hat, eine Fehlervariable einführen, in welcher alle aufgetretenen Fehler gespeichert werden. Du kannst am Ende prüfen, ob es einen Fehler gab. Wenn nicht leitest du auf deine Secureseite um, welche ich übrigens nicht unbedingt in dem Login Script speichern würde, sondern in einer externen variables.inc.php datei o.ä..
          Wenn es einen Fehler gibt, gibst du einfach den fehler aus.

          PHP-Code:
          $safe_page "intern/index.php";

          //Session starten 
          ini_set('session.use_only_cookies'1); 
          session_set_cookie_params(1440); 
          session_name("EBSESSID");     
          session_start(); 

          //Falls bereits eingeloggt 
          if ($_SESSION['login'] == true) { 
            
          header('Location: ' $safe_page); 
            exit(); 

          Eine Frage: Warum führst du eine Variable ein, die du gerademal einmal benutzt?

          PS: Ich steh ja mehr auf md5() und nicht hash("md5", ...), aber das is Geschmacksache
          Wer es nicht besser kann, der lässt es lieber bleiben...
          Wers besser kann, soll es erst mal machen!

          Kommentar


          • #6
            //Username und Passwort aus Datenbank
            lol, also unter Datenbank versteh ich mysql oder oracle, wie auch immer, die solltest du auch benutzen !!
            PHP-Code:
            if ( $humans >= ) {
               
            war ();

            Kommentar


            • #7
              Noch etwas gesehen...
              [php]
              && isset($user_found)
              [php]
              ist so falsch, denn $user_found initialisierst du etwas weiter oben mit $user_found = null;

              Kommentar


              • #8
                den login script gibt es wesentlich kürzer.
                Hast du dort schon sicherheit beachtet?

                den logout hätt ich einfach

                session_start();
                session_destroy();



                aber ich kenn mich mit der sicherheit im login selber noch nciht aus kanns nich weiter einschätzen.
                will auch nix falsches sagen

                Kommentar


                • #9
                  Ich will auch mal meinen Senf dazu geben ...

                  Die schon angesprochene Header Geschichte würde ich auch abändern, indem du bei Erfolg umleitest und jeder Misserfolg/Fehler gesammelt wird und am Ende beim Formular angezeigt wird.
                  Ich finde deinen Programmierstil unsauber, weil du keine klare Linie beim Einrücken und Klammern einhälst, aber die Lesbarkeit ist ja eher deine Sache...

                  Dann aber zu den sicherheitsbedenklichen bis sicherheitskritischen Teilen:
                  PHP-Code:
                  $user_hpass hash('sha256'$_POST['user_pass']); 
                  Diese Zeile um ein Salt (Kryptologie) – Wikipedia erweitern, um von vornherein den Standard zu halten. Positiv anzumerken möchte ich zudem an dieser Stelle SHA-256!
                  PHP-Code:
                  $dbarray file("userdb.dat"); 
                  Diese Zeile wird mit großer Wahrscheinlichkeit bei dir eine Sicherheitslücke sein, weil diese Datei von jedem Client/Browser aus gelesen werden kann, sofern du keine Vorkehrungen dagegen getroffen hast! Sollte das der Fall sein nehme ich meine Kritik natürlich zurück... :P

                  Zudem nochmal Punkte wie Session Fixation – Wikipedia und Session Hijacking – Wikipedia ansehen und die Funktionen zum Zerstören und Regenerieren der Session ansehen!

                  ...und zu guter Letzt noch eine Performance Anmerkung:
                  PHP-Code:
                  foreach($dbarray as $user) {
                      
                  $elemente explode("|",$user);
                      if (
                  $elemente[0] == $user_hname) {
                          
                  $dbuser_hname $elemente[0];
                          
                  $dbuser_hpass $elemente[1];
                          
                  $user_found $elemente[2];
                      }

                  Du durchläufst IMMER die gesamte Datei, auch wenn ein Benutzer bereits gefunden wurde und das dann auch noch mit einer langsamen foreach-Schleife, wo du doch gar nicht auf die Keys zugreifen möchtest/brauchst: Also das ganze in eine Funktion kapseln, dann kannst du bei Erfolg rausspringen!

                  Kommentar


                  • #10
                    Zitat von Papst Beitrag anzeigen
                    Noch etwas gesehen...
                    PHP-Code:
                    && isset($user_found
                    ist so falsch, denn $user_found initialisierst du etwas weiter oben mit $user_found = null;
                    isset prüft nicht nur, ob eine Variable existiert, sondern auch ob sie nicht null ist. Insofern schon okay, wobei die Intialisierung natürlich irgendwie keinen Sinn macht.

                    Das Perfomance-Problem sehe ich auch, wüsste auf die Schnelle allerdings auch keine Alternative, du könntest per break aber zumindest aus der Schleife rausgehen, wenn du den Benutzer gefunden hast.

                    Kommentar


                    • #11
                      So habe ich das bei mir gelöst

                      LOGON.PHP
                      PHP-Code:
                      <script LANGUAGE="JavaScript">
                          function pruefen()
                          {
                              var Okay;
                              var Meldung;
                              Meldung="";
                              Okay=true;
                              if (document.FormLogon.Benutzer.value=="")
                              {
                                  Meldung="Benutzername nicht angegeben.\n";
                                  Okay=false;
                              }
                              if (document.FormLogon.Passwort.value=="")
                              {
                                  Meldung=Meldung + "Passwort nicht angegeben.\n";
                                  Okay=false;
                              }
                              if (Okay==false)
                              {
                                  alert (Meldung);
                                  return false;    
                              }
                              if (Okay==true)
                              {
                                  return true;
                              }
                          }
                      </script>

                      <?PHP
                          
                      INCLUDE('logon.inc.css'); # Style Sheets Einbinden
                          
                      INCLUDE('config.inc.php'); # Konfiguration Einbinden

                          
                      ECHO "<DIV ID=Body>\n";
                              ECHO 
                      "<DIV ID=Ueberschrift>\n";
                                  ECHO 
                      "Anmeldung Verwaltung Fraesen\n";
                              ECHO 
                      "</DIV>\n";
                              ECHO 
                      "<DIV ID=Form>\n";
                                  ECHO 
                      "<FORM Name=FormLogon ACTION=checkup.php METHOD=POST onSubmit='return pruefen()'>\n";
                                      ECHO 
                      "Benutzername:<br>\n";
                                      ECHO 
                      "<INPUT TYPE=TEXT NAME=Benutzer ID=Form_Text><br>\n";
                                      ECHO 
                      "Passwort:<br>\n";
                                      ECHO 
                      "<INPUT TYPE=Password NAME=Passwort ID=Form_Text><br>\n";
                                      ECHO 
                      "<INPUT TYPE=SUBMIT VALUE='Anmelden' ID=Form_Button><br>\n";
                                  ECHO 
                      "</FORM>\n";
                              ECHO 
                      "</DIV>\n";
                          ECHO 
                      "</DIV>\n";
                      ?>
                      CHECKUP.PHP

                      PHP-Code:
                      <?PHP
                          
                      #error_reporting(E_ALL); #Error Report Einschalten
                          
                      INCLUDE('config.inc.php'); #Die Configurations Datei Einbinden
                          
                      $Benutzer=$_POST['Benutzer']; # Post Variable Benutzer Abfragen
                          
                      $Passwort=$_POST['Passwort']; # Post Variable Passwort Abfragen
                          
                      $Connect=MYSQL_CONNECT($Config_Host,$Config_Benutzer,$Config_Pass); # Zu SQL Server Verbinden
                          
                      MYSQL_SELECT_DB($Config_DB); # Datenbank Ausw�hlen
                          
                      $SQL="SELECT * FROM system_user WHERE User='$Benutzer' AND Passwort='$Passwort'"# Abfrage ob Nutzer Existiert
                          
                      $Result=MYSQL_QUERY($SQL,$Connect); # Abfrage an SQL Serer Absetzen
                          
                      $ROW=MYSQL_FETCH_ASSOC($Result); # Ergebniss Auslesen
                          
                      $TBL_User    =$ROW['User']; # Die Ergbniss User Variablen zuweisen
                          
                      $TBL_Pass    =$ROW['Passwort']; # Das ergebniss Passwort einer Variablen zuweisen
                          
                      $TBL_User_ID=$ROW['User_ID']; # Ergebniss Level einer Vraiblen zuweisen
                          
                      IF ($Benutzer==$TBL_User AND $Passwort==$TBL_Pass# If Abfrage ob Passwort und User wirklich Identisch
                          
                      {
                              
                      SESSION_START(); # Session Starten
                              
                      $_SESSION['User']    =$TBL_User# User einer Session Variablen zuweisen
                              
                      $_SESSION['User_ID']    =$TBL_User_ID# Level einer Session Variablen zuweisen
                              
                      $_SESSION['DB']        ="verwaltung_fraesen"# Name der Datenbank die Connectet werden soll
                              
                      ECHO "<meta http-equiv='Refresh' Content='0;url=../main/main.php'>"# Weiterleiten an die Betreffende seite
                          
                      }
                          ELSE 
                      # Wenn IF nicht zutrifft
                          
                      {
                              ECHO 
                      "<meta http-equiv='Refresh' Content='0;url=logon.php'>"# Zur�ck an die Startseite
                          
                      }
                      ?>
                      config.inc.php
                      PHP-Code:
                      <?PHP
                      $Config_Host    
                      ="localhost";
                      $Config_Benutzer="";
                      $Config_Pass    ="";
                      $Config_DB    ="datenbank";
                      Gibt hier sicher vieles zu Kritisieren aber es funktioniert
                      und das reicht
                      Manchmal aber nur Manchmal sehe ich den Wald vor lauter Bäumen nicht mehr

                      Kommentar


                      • #12
                        Zitat von Lucifer Beitrag anzeigen
                        So habe ich das bei mir gelöst

                        LOGON.PHP
                        PHP-Code:
                        <script LANGUAGE="JavaScript">
                            function pruefen()
                            {
                                var Okay;
                                var Meldung;
                                Meldung="";
                                Okay=true;
                                if (document.FormLogon.Benutzer.value=="")
                                {
                                    Meldung="Benutzername nicht angegeben.\n";
                                    Okay=false;
                                }
                                if (document.FormLogon.Passwort.value=="")
                                {
                                    Meldung=Meldung + "Passwort nicht angegeben.\n";
                                    Okay=false;
                                }
                                if (Okay==false)
                                {
                                    alert (Meldung);
                                    return false;    
                                }
                                if (Okay==true)
                                {
                                    return true;
                                }
                            }
                        </script>

                        <?PHP
                            
                        INCLUDE('logon.inc.css'); # Style Sheets Einbinden
                            
                        INCLUDE('config.inc.php'); # Konfiguration Einbinden

                            
                        ECHO "<DIV ID=Body>\n";
                                ECHO 
                        "<DIV ID=Ueberschrift>\n";
                                    ECHO 
                        "Anmeldung Verwaltung Fraesen\n";
                                ECHO 
                        "</DIV>\n";
                                ECHO 
                        "<DIV ID=Form>\n";
                                    ECHO 
                        "<FORM Name=FormLogon ACTION=checkup.php METHOD=POST onSubmit='return pruefen()'>\n";
                                        ECHO 
                        "Benutzername:<br>\n";
                                        ECHO 
                        "<INPUT TYPE=TEXT NAME=Benutzer ID=Form_Text><br>\n";
                                        ECHO 
                        "Passwort:<br>\n";
                                        ECHO 
                        "<INPUT TYPE=Password NAME=Passwort ID=Form_Text><br>\n";
                                        ECHO 
                        "<INPUT TYPE=SUBMIT VALUE='Anmelden' ID=Form_Button><br>\n";
                                    ECHO 
                        "</FORM>\n";
                                ECHO 
                        "</DIV>\n";
                            ECHO 
                        "</DIV>\n";
                        ?>
                        CHECKUP.PHP

                        PHP-Code:
                        <?PHP
                            
                        #error_reporting(E_ALL); #Error Report Einschalten
                            
                        INCLUDE('config.inc.php'); #Die Configurations Datei Einbinden
                            
                        $Benutzer=$_POST['Benutzer']; # Post Variable Benutzer Abfragen
                            
                        $Passwort=$_POST['Passwort']; # Post Variable Passwort Abfragen
                            
                        $Connect=MYSQL_CONNECT($Config_Host,$Config_Benutzer,$Config_Pass); # Zu SQL Server Verbinden
                            
                        MYSQL_SELECT_DB($Config_DB); # Datenbank Ausw�hlen
                            
                        $SQL="SELECT * FROM system_user WHERE User='$Benutzer' AND Passwort='$Passwort'"# Abfrage ob Nutzer Existiert
                            
                        $Result=MYSQL_QUERY($SQL,$Connect); # Abfrage an SQL Serer Absetzen
                            
                        $ROW=MYSQL_FETCH_ASSOC($Result); # Ergebniss Auslesen
                            
                        $TBL_User    =$ROW['User']; # Die Ergbniss User Variablen zuweisen
                            
                        $TBL_Pass    =$ROW['Passwort']; # Das ergebniss Passwort einer Variablen zuweisen
                            
                        $TBL_User_ID=$ROW['User_ID']; # Ergebniss Level einer Vraiblen zuweisen
                            
                        IF ($Benutzer==$TBL_User AND $Passwort==$TBL_Pass# If Abfrage ob Passwort und User wirklich Identisch
                            
                        {
                                
                        SESSION_START(); # Session Starten
                                
                        $_SESSION['User']    =$TBL_User# User einer Session Variablen zuweisen
                                
                        $_SESSION['User_ID']    =$TBL_User_ID# Level einer Session Variablen zuweisen
                                
                        $_SESSION['DB']        ="verwaltung_fraesen"# Name der Datenbank die Connectet werden soll
                                
                        ECHO "<meta http-equiv='Refresh' Content='0;url=../main/main.php'>"# Weiterleiten an die Betreffende seite
                            
                        }
                            ELSE 
                        # Wenn IF nicht zutrifft
                            
                        {
                                ECHO 
                        "<meta http-equiv='Refresh' Content='0;url=logon.php'>"# Zur�ck an die Startseite
                            
                        }
                        ?>
                        config.inc.php
                        PHP-Code:
                        <?PHP
                        $Config_Host    
                        ="localhost";
                        $Config_Benutzer="";
                        $Config_Pass    ="";
                        $Config_DB    ="datenbank";
                        Gibt hier sicher vieles zu Kritisieren aber es funktioniert
                        und das reicht
                        Phu, ich weiß garnicht wo ich anfangen soll
                        1. Was wenn Name und PW nicht angegeben sind? Da kommt die falsche Fehlermeldung
                        2. MySQL Injection gefahr
                        3. Dein HTML ist nicht valide
                        4. statt html refresh kannst du gleich die php eigene header Funktion verwenden

                        so das wars mal von mir

                        Kommentar


                        • #13
                          Vielen Dank an euch alle für die Kommentare. Ich werde mir möglichst alles davon zu Herzen nehmen um das Skript zu verbessern.

                          zu der "Datenbank"
                          Zitat von PhillKill12 Beitrag anzeigen
                          lol, also unter Datenbank versteh ich mysql oder oracle, wie auch immer, die solltest du auch benutzen !!
                          Klar...da hast du absolut recht. Aber das steht auch nur drin weil mein Ziel natürlich ist das ganze in einer Datenbank zu speichern. Die momentane Lösung ist nur vorübergehend. Ich dachte es wäre sinnvoll nicht alles gleichzeitig anzufangen und hab deshalb erstmal ohne MySQL gearbeitet.


                          gruß,
                          daniel.

                          Kommentar


                          • #14
                            Les dir das am besten mal durch: Zend Framework: Documentation: Zend Framework Coding Standard f&uuml;r PHP - Zend Framework Manual
                            Wenn man sich daran hält wird der Code um einiges lesbarer.

                            Warum überprüfst du nur mit Javascript ob ein Username und Passwort eingegeben ist ?
                            Javascript kann jeder ausschalten.

                            Rest: s.h. Post von ragtek.
                            The W3C Markup Validation Service

                            Edit: Kommentare sind zwar gut, aber man braucht nicht für jede Zeile einen Kommentar, sondern nur da wo man nicht auf anhieb weiß was die Zeile macht.
                            Signatur:
                            PHP-Code:
                            $s '0048656c6c6f20576f726c64';
                            while(
                            $i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

                            Kommentar


                            • #15
                              Zitat von ByStones Beitrag anzeigen
                              Warum überprüfst du nur mit Javascript ob ein Username und Passwort eingegeben ist ?
                              Javascript kann jeder ausschalten.
                              Frage Wie Überprüft man ein Formular ob einträge in Formularfeldern Getätigt wurden? ohne diese jetzt auf eine Neue Seite zu verweisen?
                              und das alle Einträge die Getätigt wurden auch erhalten bleiben?
                              Manchmal aber nur Manchmal sehe ich den Wald vor lauter Bäumen nicht mehr

                              Kommentar

                              Lädt...
                              X