vapita: Reihenfolge beim Überprüfen neuer Passwörter

Beitrag lesen

Hallo Tom,

Ach, die berühmten IF-SCHLEIFEN ;-)

Oder gibt es sie doch?

Da hatte ich wohl einen Knoten im Gehirn. Es ist natürlich eine IF-Abfrage, keine -Schleife. Jedenfalls nicht in meinem Fall. Danke für den Hinweis auf die nette Lektüre. 😉

Das Ganze kannst Du auch als leicht lesbare Funktion aufbauen.

function (insert_new_pass($pass1, $pass2))
{

   if ( !test1() ) return 'Fehler: Eine Passwortangabe fehlt';
   if ( !test2() ) return 'Fehler: Passworte stimmen nicht überein';  
   if ( !test3() ) return 'Fehler: Passwortlänge zu kurz';  
   if ( !test4() ) return 'Fehler: Unerlaubte Zeichen im Passwort';  
   if ( !test5() ) return 'Fehler: Es muss mindestens ein Groß, ein Klein, eine Ziffer, ein Sonderzeichen im Passwort enthalten sein'; 

   # ...

   if ( !db_insert_password() ) return 'Fehler: Eintragung in die DB nicht möglich';  

   return true;
}

Prüfen musst Du dann nach dem Aufruf der Funktion auf

if (($message = insert_new_pass()) === true ## weitermachen, sonst $message ausgeben.

Und anstelle der statischen Fehlermeldungen und TRUE könntest Du auch Fehlernummern und 0 zurückgeben. Dann kannst Du die Fehlermeldungen anhand der Nummer sprachabhängig ausgeben lassen.

Ich habe die Anregungen umgesetzt und die Password-Klasse etwas umgearbeitet:

    /**
     * @param $plain_password
     * @return false|string|null
     */
    public function hash($plain_password)
    {
        $plain_password = (is_array($plain_password)) ? array_pop($plain_password) : $plain_password;
        return password_hash($plain_password, PASSWORD_DEFAULT);
    }
    /**
     * @param string $plain_password
     * @param string $correct_hash
     * @return bool
     */
    public function verify(string $plain_password, string $correct_hash)
    {
       return password_verify($plain_password, $correct_hash);
    }
    /**
     * @param $password
     * @return bool
     */
    private function isString($password){
        if(is_array($password)){
            foreach ($password as $item){
                $passwordIsString = (is_string($item)) ?? false;
            }
            return ($passwordIsString) ?? false;
        } else {
            return (is_string($password)) ?? false;
        }
    }

Ich prüfe, ob das Passwort (oder die Passwörter, wenn es ein Array ist) ein String ist.

    /**
     * @param array $password
     * @return bool
     */
    private function isEqual(array $password){
        return ($password[0] == $password[1]) ?? false;
    }

    /**
     * @param $password
     * @return bool
     */
    private function hasMinLength($password){
        $password = (is_array($password)) ? array_pop($password) : $password;
        return (strlen($password) > 7) ?? false;
    }

Ich prüfe einmal mit strlen() die Zeichenlänge, jedoch brauch ich das gar nicht mehr, da ich bereits mit isComplex() prüfe, ob das Passwort lang genug ist, oder?

    /**
     * @param $password
     * @return bool
     */
    private function isAllowed($password){
        // TODO: auf erlaubte Zeichen prüfen
        return true;
    }

Ich bin mir noch nicht sicher, wie ich prüfe, ob nicht erlaubte Zeichen enthalten sind, bzw. welche das eigentlich sein sollen. Ich würde es wahrscheinlich auf lateinische Buchstaben, arabische Ziffern und die Sonderzeichen @#-_$%^&+=§!? begrenzen.

    /**
     * @param $password
     * @return bool
     */
    private function isComplex($password){
        $password = (is_array($password)) ? array_pop($password) : $password;

        /** Das Passwort muss mindestens
         * - einen Kleinbuchstaben,
         * - einen Großbuchstaben,
         * - eine Ziffer und
         * - ein Sonderzeichen @#-_$%^&+=§!?
         * enthalten.
         * Das Passwort muss zwischen 8 und 20 Zeichen lang sein.
         */
        return (preg_match('/^(?=.*\d)(?=.*[@#\-_$%^&+=§!\?])(?=.*[a-z])(?=.*[A-Z])[0-9A-Za-z@#\-_$%^&+=§!\?]{8,20}$/',$password))? true : false;
    }

}

Hier prüfe ich ja eigentlich auch nochmals die Zeichenkettenlänge. Entferne ich dies hier wieder oder lasse ich einfach die hasMinLentgh() weg?

    /**
     * @param array $password
     * @return int
     */
    public function validate(array $password):int
    {
        if(!$this->isString($password))     return 1601;    // kein String
        if(!$this->isEqual($password))      return 1602;    // stimmt nicht überein
        if(!$this->hasMinLength($password)) return 1603;    // ist nicht lang genug
        if(!$this->isAllowed($password))    return 1604;    // verwendet nicht erlaubte Zeichen
        if(!$this->isComplex($password))    return 1605;    // ist nicht komplex genug
        return 0; // alles in Ordnung
    }

So ist es tatsächlich übersichtlicher. Da hab ich wieder was gelernt. Vielen Dank dafür.

Die Idee mit den Fehlercodes gefällt mir gut. In der View rufe ich die Fehlermeldung dann über ein Array ab.

Beste Grüße

vapita

0 97

Reihenfolge beim Überprüfen neuer Passwörter

vapita
  • datenbank
  • php
  1. 0
    Rolf B
    1. 2
      TS
      • datenbank
      • php
      • sicherheit
      1. 0
        vapita
        1. 1
          TS
          1. 0
            vapita
        2. 0
          Rolf B
          1. 0
            vapita
            1. 0
              Rolf B
            2. 2
              TS
              • php
              • programmiertechnik
              1. 0
                vapita
                1. 1
                  Rolf B
                  1. 2
                    Der Martin
                  2. 0
                    vapita
                  3. 0
                    vapita
                    1. 1
                      Rolf B
      2. 0
        dedlfix
        1. 1
          TS
          1. 0
            localhorst
            • humor
            1. 2
              kai345
              1. 0
                TS
                1. 2
                  kai345
                  1. 0
                    Robert B.
              2. 0
                Robert B.
                1. 0
                  TS
                  1. 0
                    MudGuard
                    1. 0
                      Der Martin
                      1. 0
                        Robert B.
          2. 0
            dedlfix
            1. 0
              localhorst
              • fachbegriff
          3. 2
            Rolf B
            1. 0
              dedlfix
              1. 0
                Rolf B
                1. 0
                  1unitedpower
        2. 1
          localhorst
          • php
          • sicherheit
          • test
          1. -2
            Tabellenkalk
            1. 1
              Der Martin
          2. 0
            dedlfix
          3. 0
            Rolf B
          4. 1

            == oder === ?

            TS
            1. 1
              localhorst
              1. 0
                TS
            2. 0
              Rolf B
              1. 0
                TS
                • menschelei
              2. 1
                dedlfix
                1. 0
                  TS
            3. 0
              dedlfix
              1. 1
                TS
      3. -3
        klawischnigg
        1. 1
          localhorst
          1. -2
            klawischnigg
    2. 0
      vapita
      1. 3
        TS
        • datenbank
        • php
        • verschlüsselung
  2. 0
    Robert B.
    • sicherheit
    1. 0
      Rolf B
    2. 0
      vapita
      1. 2
        Rolf B
        1. 0
          vapita
          1. 0
            Robert B.
            • programmiertechnik
      2. 0
        Robert B.
        1. 0
          Tabellenkalk
          1. 2
            Rolf B
            1. 0
              Tabellenkalk
              1. 0
                Rolf B
  3. 1
    tk
  4. 0

    Aufteilung der Funktion, MVC

    localhorst
    • datenbank
    • php
    • programmplanung
    1. 0
      Rolf B
      1. 2
        vapita
        1. 0
          vapita
          1. 0
            Rolf B
            1. 0
              vapita
  5. -1
    Raketenlagermeister
    • javascript
    • php
    1. 0
      Peter Pan (no reg.)
      1. 0
        Raketenlagermeister
        1. 1
          Peter Pan (no reg.)
          1. 0
            Raketenlagermeister
            1. 0
              Rolf B
              1. 0
                Auge
                1. 0
                  Rolf B
                  1. 0

                    Highlight.js für PHP

                    vapita
                    1. 1
                      Auge
                      1. 0
                        vapita
                        • javascript
                        • php
                        • richtigstellung
                2. 0
                  Raktenlagermeister
                  1. 0
                    Matthias Apsel
                  2. 0
                    kai345
              2. 0
                Henry
                • editor
                • javascript
                • php
      2. 0

        Apropos Peter Pan

        Raketenlagermeister
        • sonstiges
        1. 0

          Bevor gefragt wird

          Raketenlagermeister
          • urheberrecht
        2. 0
          Matthias Apsel
          1. 0
            Raketenlagermeister
            1. 0
              Matthias Apsel
              1. 0
                Raketenlagermeister
                1. 0

                  Doch kein Pflaumenschnaps

                  Raktenlagermeister
                  1. 0
                    Matthias Apsel
                    1. 0
                      Raktenlagermeister
                      1. 0
                        Matthias Apsel
    2. 0

      Frage zu Mozillas „sicheres Passwort“ und Update

      Raketenlagermeister