Vinzenz Mai: Passwort Prüffunktion

Beitrag lesen

Hallo Matze,

Zwei Sekunden Zwangspause nach drei oder fünf Fehlversuchen sind übrigens ein hervorragendes Mittel gegen Brute-Force-Angriffe.

Ich hab jetzt am Ende der Funktion ein sleep(120);, glaube aber, dass das dort an der falschen Stelle ist oder?

Ja, diese Prüfung ist unabhängig davon, ob das Passwort gut oder schlecht ist.
Da geht es um das Mitloggen erfolgreicher und nicht erfolgreicher Anmeldungen.
Das bedeutet, dass Du die Prüfung bei der Anmeldung vornehmen musst. Genau dort, nicht woanders. Ob Du die (relevanten letzten) Anmeldeversuche in einer Datei oder einer DB speicherst, das spielt prinzipiell keine Rolle. Du musst es nur richtig machen :-)

hier noch einmal der Code (erweitert und vollständig)

function good_pwd($string, $minlenght, $maxlenght, $refstring){

Grr, bitte einige Dich mit Dir darauf, in Zukunft generell length zu schreiben.

Ist die Funktion so jetzt einigermaßen brauchbar?

Irgendwie ist mir immer noch unklar, wozu Du diese Prüfung machst. Gegen welche Angriffszenarien möchtest Du den Anwender schützen?

Schreibst Du zum Beispiel die Verwendung verschiedener Zeichenklassen vor, z.B. mindestens Groß- und Kleinbuchstaben oder Buchstaben plus Ziffern, dann kannst Du Dir die Prüfung auf nur gleiche Zeichen oder auf eine Sequenz sparen.

Trotzdem noch ein Hinweis, wie Du Deinen Code vereinfachen kannst.

statt (hier Deine Version aus [pref:t=167103;m=1090026]):
[code lang=php]
        # Wenn String nur aus einem Zeichen besteht

$length = strlen($string);
        $chars = array();
        $chars = str_split($string);
        for($i = 0; $i < $length; $i++){
                if(!isset($charold)) $charold = $chars[$i];
                if($chars[$i] == $charold){
                        $bad_pwd = '1';
                }else{
                        $bad_pwd = '0';
                        $i = $length;
                }
        }
        if($bad_pwd == '1') $error = '5';

  
arbeitet bestimmt nicht korrekt, ich verstehe ehrlich gesagt überhaupt nicht, was das soll. Kommentiere Deinen Code!  
  
Mein Vorschlag wäre:  
  
~~~php
  
    # Wenn String nur aus einem Zeichen besteht  
    // Erzeuge ein Array der einzelnen Zeichen  
    $chars = [link:http://www.php.net/manual/de/function.str-split.php@title=str_split]($string);  
  
    // Entferne doppeltes Auftreten  
    $chars_unique = [link:http://www.php.net/manual/de/function.array-unique.php@title=array_unique]($chars);  
  
    // Wenn das resultierende Array nur einen Wert enthält, dann gab es nur  
    // ein unterschiedliches Zeichen  
    if (count($chars_unique) == 1) {  
        // Hmm, klemmte da eine Taste :-)  
        $error = 5;  
    }  

bzw.

  
    // Wenn das um die Dubletten bereinigte Array der Zeichen der Zeichenkette  
    // nur ein Element enthält, dann ist etwas faul im Staate Dänemark ...  
    if (count(array_unique(str_split($string))) == 1) {  
        $error = 5;  
    }  

Alternativ böte sich auch array_count_values() an.

Ach ja, ich halte es für eine gute Idee, die einzelnen Prüfungen in hübsche kleine einzelne und gut testbare Funktionen zu packen. Das ganze könntest Du dann in eine kleine Klasse packen. Mit dieser Klasse kannst Du dann auf einfache Weise und flexibel die Anforderungen abprüfen, die Du je nach Anwendungsfall hast. Somit hast Du wieder ein Stück wiederverwertbaren Code geschrieben und für die Zukunft Arbeit erspart.

Freundliche Grüße

Vinzenz