# Password auf Groß-/Kleinschreibung und Sicherheit prüfen



## weedo (6. Dezember 2009)

Hi,

ich habe eine Funktion, die ein eingegebenes Password auf seine Sicherheit überprüfen soll.


```
function chksav(obj) {
  var show = 0;
  pass = obj.value;
  if(pass.indexOf("1","2","3","4","5","6","7","8","9","0") != "-1") {
    show++;
    alert("zahl");
  }
  if(pass.indexOf("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") != "-1") {
    show++;
    alert("buchstabe");
  }
  if(pass.indexOf("^","°","!","\"","§","$","%","&","/","(",")","=","?","`","´","\\","}","]","[","{","²","³","@","€","|","<",">",",",";",":",".","-","_","#","'","+","*","~") != "-1") {
    show++;
    alert("zeichen");
  }
  alert(show);
}
```

Jetzt treten 2 Probleme auf. Wenn ich jetzt ein Password eingebe, was 12asdf!"§ ist, bekomm ich zwei alerts. einmal mit dem Inhalt buchstabe und einmal mit 1. Eigentlich sollte es aber 4 alerts geben und das versteh ich nicht.

Des Weiteren, wollte ich gerne das Password auf Groß- und Kleinschreibung überprüfen. aber ich weiß nicht wie ich das machen soll... Habt ihr vielleicht einen Tipp für mich?

lg weedo


----------



## tobee (6. Dezember 2009)

Die indexOf Funktion erwaret nur einen Parameter. Wenn du Sie benutzt dann ich einer Schleife.
btw. Zahlen brauchen keine "


----------



## chmee (6. Dezember 2009)

Versuch es lieber mit Regex. Dann kannst Du die Anzahl der Funde als Maßstab nehmen.
http://de.selfhtml.org/javascript/objekte/regexp.htm

php-Beispiel Hier : http://www.tutorials.de/forum/coders-talk/345970-passwortstaerke-ermitteln.html

mfg chmee


----------



## weedo (6. Dezember 2009)

Ich fand die Lösung mit einer Schleife nicht sonderlich gut, also hab ich lieber die match() variante versucht.

Das einzige problem, dass ich jetzt habe ist, dass mir mein alert null ausgibt. was mache ich falsch?


```
function chksav(obj) {
  var show = 0;
  password = obj.value;
  if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  show += 5 
  if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) show += 5 
  if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  show += 5 
  if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  show += 10 
  if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  show += 10 
  if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  show += 10 
  if (password.match(/^\w+$/) || password.match(/^\d+$/) )  show -= 10 
  if (show < 101) {
    show = show * 4;
  } else {
    show = 400;
  }
  alert(password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/));
  document.getElementById("passwordsicherheit").style.width = show;
}
```


----------



## weedo (6. Dezember 2009)

Ok hab es hinbekommen. Für die Sufu nochmal der fertige Code:

Die Funktionen (teils im internet gefunden):

```
function chksav(obj) {
  var show = 0;
  password = obj.value;
  show += password.length * 4
  show += ( checkRepetition(1,password).length - password.length ) * 1
  show += ( checkRepetition(2,password).length - password.length ) * 1
  show += ( checkRepetition(3,password).length - password.length ) * 1
  show += ( checkRepetition(4,password).length - password.length ) * 1
  if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  show += 5 
  if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) show += 5 
  if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  show += 5 
  if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  show += 10 
  if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  show += 10 
  if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  show += 10 
  if (password.match(/^\w+$/) || password.match(/^\d+$/) )  show -= 10 
  if (show < 0) {
    show = show * -1;
  }
  if (show < 101) {
    breite = show * 4;
    breite = breite + "px";
  } else {
    breite = 400;
    breite = breite + "px";
  }
  document.getElementById("passwordsicherheit").style.width = breite;
}

function checkRepetition(pLen,str) {
    res = ""
    for ( i=0; i<str.length ; i++ ) {
        repeated=true
        for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
            repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen))
        if (j<pLen) repeated=false
        if (repeated) {
            i+=pLen-1
            repeated=false
        }
        else {
            res+=str.charAt(i)
        }
    }
    return res
}
```

Und im Htmlteil:


```
<!-- Eingefeld --> 
<input type="password" name="password1" id="password1" onKeyUp="chksav(this);" onChange="chklen(this);" style="width: 250px" />

<!-- div zur statusanzeige --> 
<div style="align: left; width: 400px; height: 25px; background: url('sys/images/password_bg.gif');"><div id="passwordsicherheit" style="background: url('sys/images/password.gif'); height: 25px; width: 0px;"></div></div>
```

lg weedo


----------



## weedo (6. Dezember 2009)

Ich habe doch noch eine Frage,

wie bekomm ich es hin, das dieses Script auch im Internetexplorer läuft?

lg weedo


----------



## chmee (6. Dezember 2009)

Schau Dir mal die Fehlermeldung in IE an. Vielleicht war FF nur großzügig.

mfg chmee


----------



## weedo (6. Dezember 2009)

IE meldet: Das Objekt unterstütz diese Eigenschaft oder Methode nicht :/


----------



## Parantatatam (6. Dezember 2009)

Was mir gerade noch aufgefallen ist: du bist nachlässig mit der Verwendung von Semikolons. Setz die mal bitte noch an den entsprechenden Stellen.


----------



## tobee (6. Dezember 2009)

einfach nur crack hat gesagt.:


> Was mir gerade noch aufgefallen ist: du bist nachlässig mit der Verwendung von Semikolons. Setz die mal bitte noch an den entsprechenden Stellen.


Am besten den Quellcode hier kontrollieren lassen.


----------



## Maik (6. Dezember 2009)

einfach nur crack hat gesagt.:


> Was mir gerade noch aufgefallen ist: du bist nachlässig mit der Verwendung von Semikolons. Setz die mal bitte noch an den entsprechenden Stellen.





tobee hat gesagt.:


> Am besten den Quellcode hier kontrollieren lassen.


*lol*



			
				http://www.jslint.com/ hat gesagt.:
			
		

> Error:
> 
> Problem at line 4 character 30: Missing semicolon.
> 
> ...



mfg Maik


----------



## weedo (6. Dezember 2009)

ja ok <:

Ich hab es mal durchlaufen lassen und die meisten Fehler beseitigt. Das Ergebniss sieht jetzt wie folgt aus:


```
function chkpass() {
  if((document.getElementById("password1").value != "") && (document.getElementById("password1").value != "")) {
    if(document.getElementById("password2").value == document.getElementById("password1").value) {
      document.getElementById("passchk").innerHTML = "<img src=\"sys/images/ok.gif\" /> Die Passw&ouml;rter stimmen &uuml;berein.";
    } else {
      document.getElementById("passchk").innerHTML = "<img src=\"sys/images/fail.gif\" /> Die Passw&ouml;rter stimmen nicht &uuml;berein.";
    }
  }
}

function checkRepetition(pLen,str) {
  res = "";
  for ( i=0; i<str.length ; i++ ) {
    repeated=true;
    for (j=0;j < pLen && (j+i+pLen) < str.length;j++) {
      repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
    }
    if (j<pLen) {
      repeated=false;
    }
    if (repeated) {
      i+=pLen-1;
      repeated=false;
    }
    else {
      res+=str.charAt(i);
    }
  }
  return res;
}

function chksav(obj) {
  var show = 0;
  var passfullsave = 0;
  password = obj.value;
  show += password.length * 4;
  show += ( checkRepetition(1,password).length - password.length ) * 1;
  show += ( checkRepetition(2,password).length - password.length ) * 1;
  show += ( checkRepetition(3,password).length - password.length ) * 1;
  show += ( checkRepetition(4,password).length - password.length ) * 1;
  if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) { 
    show += 5; 
  }
  if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) { 
    show += 5; 
  }
  if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) { 
    show += 5;
  }
  if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) { 
    show += 10; 
  }
  if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/)) { 
    show += 10; 
  }
  if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/)) { 
    show += 10; 
  }
  if (password.match(/^\w+$/) || password.match(/^\d+$/) ) { 
    show -= 10; 
  }
  if (show < 0) {
    show = show * -1;
  }
  if (show < 101) {
    breite = show * 4;
    breite = breite + "px";
  } else {
    passfullsave = 1;
    breite = 400;
    breite = breite + "px";
  }
  document.getElementById("passwordsicherheit").style.width = breite;  
  if(password.length != 0) {
    if(password.length < 6) {
      passtext = "Das Passwort ist zu kurz.";
    } else {
      if(show <= 25) {
        passtext = "Unsicher!";
      } else {
        if((show >= 26) && (show <= 50)) {
          passtext = "Weniger sicher!";
        } else {
          if((show >= 51) && (show <= 75)) {
            passtext = "Sicher";
          } else {
            if((show >= 76) && (show <= 101)) {
              passtext = "Sehr sicher!";
            } else {
              passtext = "";
            }
          }
        }
      }
    }
  } 
  if(passfullsave == 1) {
    passtext = "Un&uuml;bertroffen sicher!";
  }
  document.getElementById("passtext").innerHTML = "<i>" + passtext + "</i>";
}
```

Ich bekomme jetzt noch folgende fehler:


```
Error:

Problem at line 44 character 37: Unescaped '^'.

if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) {

Problem at line 44 character 62: Unescaped '^'.

if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) {

Problem at line 53 character 35: Unescaped '^'.

if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/...

Problem at line 56 character 35: Unescaped '^'.

if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z...

Problem at line 74 character 22: Use '!==' to compare with '0'.

if(password.length != 0) {

Implied global: document 2,3,4,6,73,100, res 12,26,29, i 13,15,16,22,26, repeated 14,16,19,21,23, j 15,16,18, password 35,36,37,38,39,40,41,44,47,50,53,56,59,74,75, breite 66,67,70,71,73, passtext 76,79,82,85,88,90,98,100

Global checkRepetition, chkpass, chksav

1-9 chkpass()

11-30 checkRepetition(pLen, str)

32-101 chksav(obj)
Variable passfullsave, show
Global checkRepetition

/*members charAt, getElementById, innerHTML, length, match, style, value, 
    width
*/
```

Trotzdem funktioniert es im Internet Explorer immernoch nicht :/


----------



## Sven Mintel (6. Dezember 2009)

Moin,


Das circumflex hat in Zeichenklassen eine spezielle Bedeutung(es dient der Negation der Zeichenklasse). Daher muss es escaped werden, wenn du es nicht mit dieser speziellen Bedeutung einsetzt, was auch die Fehlermeldungen besagen.

Es ist übrigens nicht vonnöten, die einzelnen Zeichen mit Kommas zu trennen...ein Komma ist in RegExp ein Komma und kein Separator(mal ausgenommen die Verwendung zur Längenangabe eines Suchmusters)


----------



## weedo (7. Dezember 2009)

Ich hab es jetzt escaped und laut JSLint nurnoch folgenden Fehler:



> Error:
> 
> Implied global: document 2,3,4,6,73,100, res 12,26,29, i 13,15,16,22,26, repeated 14,16,19,21,23, j 15,16,18, password 35,36,37,38,39,40,41,44,47,50,53,56,59,74,75, breite 66,67,70,71,73, passtext 76,79,82,85,88,90,98,100



Im IE geht es aber leider immernoch nicht  Der Fehlerdialog gibt aus:



> Zeile: 36
> Zeichen: 3
> Fehler: Das Objekt unterstütz diese Eigenschaft oder Methode nicht
> Code: 0
> URL: http://localhost/index.php?site=register



Die Zeile wäre dann -> _show += password.length * 4;_


```
function chkpass() {
  if((document.getElementById("password1").value != "") && (document.getElementById("password1").value != "")) {
    if(document.getElementById("password2").value == document.getElementById("password1").value) {
      document.getElementById("passchk").innerHTML = "<img src=\"sys/images/ok.gif\" /> Die Passw&ouml;rter stimmen &uuml;berein.";
    } else {
      document.getElementById("passchk").innerHTML = "<img src=\"sys/images/fail.gif\" /> Die Passw&ouml;rter stimmen nicht &uuml;berein.";
    }
  }
}

function checkRepetition(pLen,str) {
  res = "";
  for ( i=0; i<str.length ; i++ ) {
    repeated=true;
    for (j=0;j < pLen && (j+i+pLen) < str.length;j++) {
      repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
    }
    if (j<pLen) {
      repeated=false;
    }
    if (repeated) {
      i+=pLen-1;
      repeated=false;
    }
    else {
      res+=str.charAt(i);
    }
  }
  return res;
}

function chksav(obj) {
  var show = 0;
  var passfullsave = 0;
  password = obj.value;
  show += password.length * 4;
  show += ( checkRepetition(1,password).length - password.length ) * 1;
  show += ( checkRepetition(2,password).length - password.length ) * 1;
  show += ( checkRepetition(3,password).length - password.length ) * 1;
  show += ( checkRepetition(4,password).length - password.length ) * 1;
  if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) { 
    show += 5; 
  }
  if (password.match(/(.,*[!@#$%\^&*?_~].,*[!@#$%\^&*?_~])/)) { 
    show += 5; 
  }
  if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) { 
    show += 5;
  }
  if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) { 
    show += 10; 
  }
  if (password.match(/([!@#$%\^&*?_~].,)/) && password.match(/([0-9])/)) { 
    show += 10; 
  }
  if (password.match(/([!@#$%\^&*?_~.,])/) && password.match(/([a-zA-Z])/)) { 
    show += 10; 
  }
  if (password.match(/\^\w+$/) || password.match(/\^\d+$/) ) { 
    show -= 10; 
  }
  if (show < 0) {
    show = show * -1;
  }
  if (show < 101) {
    breite = show * 4;
    breite = breite + "px";
  } else {
    passfullsave = 1;
    breite = 400;
    breite = breite + "px";
  }
  document.getElementById("passwordsicherheit").style.width = breite;  
  if(password.length !== 0) {
    if(password.length < 6) {
      passtext = "Das Passwort ist zu kurz.";
    } else {
      if(show <= 25) {
        passtext = "Unsicher!";
      } else {
        if((show >= 26) && (show <= 50)) {
          passtext = "Weniger sicher!";
        } else {
          if((show >= 51) && (show <= 75)) {
            passtext = "Sicher";
          } else {
            if((show >= 76) && (show <= 101)) {
              passtext = "Sehr sicher!";
            } else {
              passtext = "";
            }
          }
        }
      }
    }
  } 
  if(passfullsave == 1) {
    passtext = "Un&uuml;bertroffen sicher!";
  }
  document.getElementById("passtext").innerHTML = "<i>" + passtext + "</i>";
}
```

Ich werd noch verrückt 

lg weedo


----------

