Sicherheitsfrage

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

  • Sicherheitsfrage

    Hallo zusammen,

    ich wollte igentlich nur fragen, ob der Code, den ich unten gepostet habe einigermaßen sicher ist und wenn nicht, warum nicht?
    mysql_escape_string wird noch eingebaut.


    PHP-Code:
    function check_login($user$pwd) {
        
    $sql "Select `id` FROM `user` WHERE `bname` = '$user' AND `pwd` = '$pwd'";
        
    $query mysql_query($sql) OR DIE (mysql_error());
        
    $result mysql_fetch_assoc($query);
        
        if (
    $result) {
            
    header('Location: Geschützerbereich');
            
    $_SESSION['logged'] = 'true';
            exit;
        } else {
            echo 
    'Login fehlgeschlagen!';
        }


  • #2
    ja, da mysql_real_escape_string so ziemlich das Wichtigste ist, würde ich es schon dazu schreiben.

    aber zu der Stelle

    if($result)

    das Array result wird doch so oder so gesetzt - unabhängig davon ob Treffer gefunden wurden oder nicht. Also so ist dein Script nicht sicher.

    Ich würds so machen:

    PHP-Code:
    function check_login($user$pwd) {
        
    $query mysql_query("SELECT id FROM `user`
                            WHERE bname='"
    .mysql_real_escape_string($user)."' AND pwd='".mysql_real_escape_string($pwd)."'
                            LIMIT 1"
    ) OR DIE (mysql_error());
        if(
    mysql_num_rows($query) != 0) {
            
    header('Location: Geschützerbereich');
            
    $_SESSION['logged'] = true;
            exit;
        } else {
            echo 
    'Login fehlgeschlagen!';
        }

    Btw, 'true' != true

    Kommentar


    • #3
      PHP-Code:
      DIE (mysql_error()) 
      Sollte nur zu Test bzw Debuggzwecken eingebaut werden!
      PHP-Code:
      $_SESSION['logged'] = 'true'
      Ein String, obwohl es auch ein Boolean tun würde?
      mysql_escape_string wird noch eingebaut.
      mysql_real_escape_string wäre besser.
      PHP-Code:
      $sql "Select `id` FROM `user` WHERE `bname` = '$user' AND `pwd` = '$pwd'"
      Code:
      SELECT COUNT(*) AS i
      Wäre auch besser.
      Dann müsstest du $result['i'] auf 0 prüfen und bei 0 das Login als fehlgeschlagen markieren. Ein anderer Vorteil wäre, das du auch überprüfen kannst, ob mehrere Nutzer mit gleichem PW und Namen existieren und entsprechend reagieren kannst^^

      So, das wars erstmal^^

      Kommentar


      • #4
        ok, stimmt. Danke war nen denkfehler

        Kommentar


        • #5
          Ein anderer Vorteil wäre, das du auch überprüfen kannst, ob mehrere Nutzer mit gleichem PW und Namen existieren und entsprechend reagieren kannst^^

          So, das wars erstmal^^ [/B]
          DAs wird schon bei der registrierung überprüft

          Kommentar


          • #6
            Original geschrieben von Boron

            PHP-Code:
                if(mysql_num_rows($query) != 0) { 
            Lieber ...
            PHP-Code:
                if(mysql_num_rows($query) == 1) { 
            und in $_bakers Beispiel wiederum auf != 1.
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              ok. warum?

              Kommentar


              • #8
                Wenn durch was für Umstände auch immer -1 zurückgegeben wird, würdest du den User durchwinken.
                [FONT="Helvetica"]twitter.com/unset[/FONT]

                Shitstorm Podcast – Wöchentliches Auskotzen

                Kommentar


                • #9
                  wäre es so richtig?

                  PHP-Code:
                  function check_login($user$pwd) {
                      
                  $sql sprintf("Select `id` FROM `user` WHERE 
                  bname='mysql_real_escape_string(
                  $user)' AND 
                  pwd='mysql_real_escape_string(
                  $pwd)'");
                      
                  $query mysql_query($sql) OR DIE (mysql_error());
                      
                      if (
                  mysql_num_rows($query) == 0) {
                          
                  header("Location: ".dirname($_SERVER['PHP_SELF'])."/index1.php");
                          
                  $_SESSION['logged'] = true;
                          exit;
                      } else {
                          echo 
                  'Login fehlgeschlagen!';
                      }

                  Kommentar


                  • #10
                    Um ehrlich zu sein nein, denn es würde jeden nicht registrierten Nutzer durchlassen, registrierte aber würden ausgesperrt werden

                    Und das man die(mysql_error()) nur zum Debuggen benutztz, habe ich schon erwähtn

                    Kommentar


                    • #11
                      upps.. was so ein kleines " ! " doch ausmacht ^^

                      Kommentar


                      • #12
                        Original geschrieben von Boron
                        if($result)

                        das Array result wird doch so oder so gesetzt - unabhängig davon ob Treffer gefunden wurden oder nicht.
                        Original geschrieben von mysql_fetch_assoc()
                        Liefert ein assoziatives Array, das den geholten entprechenden Datensatz enthält. Sind keine weiteren Datensätze vorhanden gibt diese Funktion [COLOR=crimson]FALSE[/color] zurück.
                        Gruss
                        H2O

                        Kommentar


                        • #13
                          Was bringt dir das?
                          PHP-Code:
                          $_SESSION['logged'] = true
                          Wenn du hinterher anhand dieses Wertes prüfen willst, ob jemand dein Backend sehen darf, dann ist das unsicher. Mache es lieber an der Session-ID fest, die du nach erfolgreichem Login neu generierst.
                          Gruß,
                          Peter

                          Kommentar


                          • #14
                            Wenn du hinterher anhand dieses Wertes prüfen willst, ob jemand dein Backend sehen darf, dann ist das unsicher
                            Wieso sollte das unsicherer sein?
                            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                            Kommentar


                            • #15
                              Verstehe ich auch nicht ... und Benutzer sehen das Backend sowieso nicht. Immer dieser Typo3-Sprech.
                              [FONT="Helvetica"]twitter.com/unset[/FONT]

                              Shitstorm Podcast – Wöchentliches Auskotzen

                              Kommentar

                              Lädt...
                              X