Ajax: Sicherheit des Passworts zeigen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ajax: Sicherheit des Passworts zeigen

    Hallo liebes Team,

    Ich fände es toll, wenn ich meinen Besuchern beim Registrieren auch so eine schöne Passwortvalidierung in Echtzeit anbieten könnte wie Hotmail & Co. . Also so einen schönen farbigen Balken, der anzeigt, wie sicher ein Passwort bereits bei der Eingabe ist. Auf der PHP Seite hätte ich da schon eine Lösung anzubieten, jetzt müsste ich die nurnoch mit einer objTimer() Funktion und dem HTTPRequestObjekt nachladen.

    Quellcode

    1. var objTimer = null;
    2. function liveCheckPass()
    3. {
    4. if (objTimer) {
    5. window.clear.Timeout(objTimer);
    6. }
    7. objTimer = window.setTimeout("doCheckPass()", 500);
    8. }


    das auf einen onMouseUp Eventhandler anwenden.

    Evtl. könnte man ja soetwas zusammen erarbeiten, der PHP Code wird später von mir nachgeliefert.

    MfG

    kingluui
  • Danke für die schnelle Antwort,

    ich schätze damit kann ich was anfangen, werde gleich mal loslegen, komme dann zurück mit dem PHP code usw.

    Mit dem Timer will ich nur verhindern, das nicht nach jedem onKeyUp Handle der Server belasstet wird sondern erst dann, wenn der User mehr als eine halbe Sekunde keine Eingabe mehr getätigt hat, weil viele User schneller Tippen.

    Evtl. hasste da ja noch ne kleine Lösung für, die Du oben im Javascript TAG noch ergänzen könntest.

    Ach ja, es wäre sicherlich auch Sinnvoll, wenn der Passwortcheck überhaupt erst dann startet, wenn man mehr als 6 Zeichen eingegeben hat.

    MfG

    kingluui
  • ist eigentlich ganz simpel.. hab den obigen code mal mit dem wiki code von [coderwiki]HowTos/Ajax-AutoSave[/coderwiki] kombiniert - aber wieder alles ungetestet

    Quellcode

    1. <html><head>
    2. <script type="text/javascript">
    3. // Die Inaktivitätszeit, nach der automatisch gespeichert wird
    4. var inactivity = 2;
    5. var timer = 0;
    6. function Zeitaufschub() {
    7. timer = inactivity;
    8. }
    9. function Countdown() {
    10. timer--;
    11. if(timer == 0) {
    12. //Die Zeit ist um, bitte abfragen
    13. isSecure(document.getElementById('val').value);
    14. Zeitaufschub();
    15. }
    16. //Die Funktion ruft sich 1x in der Sekunde alleine auf
    17. setTimeout("Countdown()", 1000);
    18. }
    19. function isSecure(str) {
    20. try {
    21. req = window.XMLHttpRequest?new XMLHttpRequest():
    22. new ActiveXObject("Microsoft.XMLHTTP");
    23. } catch (e) {
    24. //Kein AJAX Support
    25. }
    26. req.onreadystatechange = function () {
    27. if ((req.readyState == 4) && (req.status == 200)) {
    28. //getreu dem fall, dass das element einen integerwert liefert
    29. var val = eval(req.responseText);
    30. document.getElementById('row').style.width = val;
    31. if(val < 25) {
    32. document.getElementById('row').style.backgroundColor = '#ff0000';
    33. else if(val < 50)
    34. document.getElementById('row').style.backgroundColor = '#ffcc00';
    35. else if(val < 70)
    36. document.getElementById('row').style.backgroundColor = '#aaff00';
    37. else
    38. document.getElementById('row').style.backgroundColor = '#00ff00';
    39. }};
    40. req.open("GET", 'func.php?s='+ digit);
    41. req.send(null);
    42. }
    43. </script>
    44. </head>
    45. <body onload="Zeitaufschub();Countdown();">
    46. <!- blank.gif = beliebiges transparentes bild //-->
    47. <img src="blank.gif" id="row" alt="" />
    48. <form method="post" action="">
    49. <input type="text" id="val" onkeyup="Zeitaufschub()" />
    50. </form>
    51. </body></html>
    Alles anzeigen
  • Hallo d0nUt,

    Dein o.a. Script startet mit Objekt erwartet!

    Hier die func.php

    Quellcode

    1. <?php
    2. $gbst = 0;
    3. $gbst1 = 0;
    4. $gbst2 = 0;
    5. $string = $_GET["s"];
    6. $string1 = $_GET["s"];
    7. $string2 = $_GET["s"];
    8. for ($i = 0; $i < strlen($string); $i++) {
    9. $ascii = ord($string[$i]);
    10. if ($ascii >= 65 && $ascii <= 90) {
    11. $gbst++;
    12. }
    13. }
    14. for ($i = 0; $i < strlen($string1); $i++) {
    15. $ascii = ord($string1[$i]);
    16. if ($ascii >= 97 && $ascii <= 122) {
    17. $gbst1++;
    18. }
    19. }
    20. for ($i = 0; $i < strlen($string2); $i++) {
    21. $ascii = ord($string2[$i]);
    22. if ($ascii >= 48 && $ascii <= 57) {
    23. $gbst2++;
    24. }
    25. }
    26. if($gbst >= 1) {
    27. $checkResult = 25;
    28. } else {
    29. $checkResult = 0;
    30. }
    31. if($gbst1 >= 1) {
    32. $checkResult = $checkResult+25;
    33. } else {
    34. $checkResult = 0;
    35. }
    36. if($gbst2 >= 1) {
    37. $checkResult = $checkResult+25;
    38. } else {
    39. $checkResult = 0;
    40. }
    41. echo $checkResult;
    42. ?>
    Alles anzeigen


    Die func.php Solo aufgerufen funktioniert bestens. Es wird überprüft ob der String min. 1xGroßbuchstabe, 1xKleinbuchstabe und 1xZahl enthält.

    Die Rückgabe ist ein Wert zwischen 0 und 75

    MfG

    kingluui
  • Hallo,

    als javascript Neuling würde ich sagen, dass der timer nicht richtig funktioniert.
    Wenn er einmal gestartet ist hört der nicht mehr auf die Funktion isSecure im 2 Sek. Rhythmus auszuführen.

    Ich habe das jetzt mal so realisiert.

    Quellcode

    1. var inactivity = 2;
    2. var timer = 99;
    3. function timeroff(){
    4. timer = 99;
    5. }
    6. function Zeitaufschub() {
    7. timer = inactivity;
    8. }
    9. function Countdown() {
    10. if (timer != 99){
    11. timer--;
    12. }
    13. if(timer == 0) {
    14. //Die Zeit ist um, bitte abfragen
    15. isSecure(document.getElementById('val').value);
    16. Zeitaufschub();
    17. } setTimeout("Countdown()", 1000);
    18. //Die Funktion ruft sich 1x in der Sekunde alleine auf
    19. }
    Alles anzeigen


    Quellcode

    1. <body onload="Countdown();">
    2. <input type="text" id="val" onkeyup="Zeitaufschub()" onchange="timeroff();" onblur="timeroff();">
  • Das kann gut sein, da es nur Codeschnipsel waren. Dieser Code läuft auch alleine:

    Quellcode

    1. <body onload="Countdown();">
    2. <script type="text/javascript">
    3. var inactivity = 2;
    4. var timer = 99;
    5. function timeroff(){
    6. timer = 99;
    7. }
    8. function Zeitaufschub() {
    9. timer = inactivity;
    10. }
    11. function Countdown() {
    12. if (timer != 99){
    13. timer--;
    14. }
    15. if(timer == 0) {
    16. //Die Zeit ist um, bitte abfragen
    17. //isSecure(document.getElementById('val').value);
    18. alert("isSecure(...)");
    19. Zeitaufschub();
    20. } setTimeout("Countdown()", 1000);
    21. //Die Funktion ruft sich 1x in der Sekunde alleine auf
    22. }
    23. </script>
    24. <input type="text" id="val" onkeyup="Zeitaufschub()" onchange="timeroff();" onblur="timeroff();">
    Alles anzeigen
  • nochmal zurück zu meinem script:
    * isSecure(str) zu isSecure(digit)
    * if(val < 25) { zu if(val < 25)

    und schon klappts ;)

    aber ob ein 20 stelliges passwort gemischt aus groß- und kleinbuchstaben wirklich so unsicher ist? ich weiß ja nicht

    im anhang nochmal das komplette ajax script
    Dateien
  • So, habe mich jetzt erstmal für dieses vereinfachte Version entschieden, funktioniert auch recht gut, ich kriege das mit den Bildwechseln allerdings nicht hin.

    Als kleines Dankeschön siehe wieter unten noch den aktuellen PHP Code. Hier erstmal das mit den Bildwechseln:

    Quellcode

    1. <html><head>
    2. <script type="text/javascript">
    3. function isSecure(digit) {
    4. try {
    5. req = window.XMLHttpRequest?new XMLHttpRequest():
    6. new ActiveXObject("Microsoft.XMLHTTP");
    7. } catch (e) {
    8. //Kein AJAX Support
    9. }
    10. req.onreadystatechange = function () {
    11. if ((req.readyState == 4) && (req.status == 200)) {
    12. //getreu dem fall, dass das element einen integerwert liefert
    13. var val = eval(req.responseText);
    14. document.getElementById('row').style.width = val;
    15. if(val == 0)
    16. document.getElementById('row').style.backgroundImage = 'safered.png';
    17. else if((val >= 1) && (val <= 24))
    18. document.getElementById('row').style.backgroundImage = 'safered.png';
    19. else if((val >= 25) && (val <= 49))
    20. document.getElementById('row').style.backgroundImage = 'safered.png';
    21. else if((val >= 50) && (val <= 74))
    22. document.getElementById('row').style.backgroundImage = 'safeyel.png';
    23. else
    24. document.getElementById('row').style.backgroundImage = 'safegreen.png';
    25. }};
    26. req.open("GET", 'func.php?s='+ digit);
    27. req.send(null);
    28. }
    29. </script>
    30. </head>
    31. <body>
    32. <!- blank.gif = beliebiges transparentes bild //-->
    33. <form method="post" action="">
    34. <table width="240" border="0" cellpadding="0" cellspacing="0" id="row" background="leer.png">
    35. <tr>
    36. <td>&nbsp;</td>
    37. </tr>
    38. </table>
    39. <p>
    40. <input type="text" id="val" onKeyUp="isSecure(this.value)" />
    41. </p>
    42. </form>
    43. </body></html>
    Alles anzeigen


    hier die func.php

    Quellcode

    1. <?php
    2. $gbst = 0;
    3. $gbst1 = 0;
    4. $gbst2 = 0;
    5. $string = $_GET["s"];
    6. $string1 = $_GET["s"];
    7. $string2 = $_GET["s"];
    8. for ($i = 0; $i < strlen($string); $i++) {
    9. $ascii = ord($string[$i]);
    10. if ($ascii >= 65 && $ascii <= 90) {
    11. $gbst++;
    12. }
    13. }
    14. for ($i = 0; $i < strlen($string1); $i++) {
    15. $ascii = ord($string1[$i]);
    16. if ($ascii >= 97 && $ascii <= 122) {
    17. $gbst1++;
    18. }
    19. }
    20. for ($i = 0; $i < strlen($string2); $i++) {
    21. $ascii = ord($string2[$i]);
    22. if ($ascii >= 48 && $ascii <= 57) {
    23. $gbst2++;
    24. }
    25. }
    26. if($gbst >= 1) {
    27. $checkResult = 25;
    28. } else {
    29. $checkResult = 0;
    30. }
    31. if($gbst1 >= 1) {
    32. $checkResult = $checkResult+25;
    33. } else {
    34. $checkResult = $checkResult;
    35. }
    36. if($gbst2 >= 1) {
    37. $checkResult = $checkResult+25;
    38. } else {
    39. $checkResult = $checkResult;
    40. }
    41. echo $checkResult;
    42. ?>
    Alles anzeigen


    Hier noch die Bildchen

    MfG

    kingluui
    Bilder
    • safeyel.png

      1,64 kB, 240×8, 811 mal angesehen
    • safered.png

      923 Byte, 240×8, 809 mal angesehen
    • leer.png

      161 Byte, 240×8, 803 mal angesehen
  • So, habe es mit Try&Error hin bekommen, das funktioniert bestens. Kann man evtl. noch etwas komfortabler gestalten.

    Quellcode

    1. <html><head>
    2. <script type="text/javascript">
    3. function isSecure(digit) {
    4. try {
    5. req = window.XMLHttpRequest?new XMLHttpRequest():
    6. new ActiveXObject("Microsoft.XMLHTTP");
    7. } catch (e) {
    8. //Kein AJAX Support
    9. }
    10. req.onreadystatechange = function () {
    11. if ((req.readyState == 4) && (req.status == 200)) {
    12. //getreu dem fall, dass das element einen integerwert liefert
    13. var val = eval(req.responseText);
    14. document.getElementById('row').style.width = val;
    15. if(val == 0)
    16. document.getElementById('row').style.backgroundImage = 'url(safered.png)';
    17. else if((val >= 1) && (val <= 24))
    18. document.getElementById('row').style.backgroundImage = 'url(safered.png)';
    19. else if((val >= 25) && (val <= 49))
    20. document.getElementById('row').style.backgroundImage = 'url(safered.png)';
    21. else if((val >= 50) && (val <= 74))
    22. document.getElementById('row').style.backgroundImage = 'url(safeyel.png)';
    23. else
    24. document.getElementById('row').style.backgroundImage = 'url(safegreen.png)';
    25. }};
    26. req.open("GET", 'func.php?s='+ digit);
    27. req.send(null);
    28. }
    29. </script>
    30. </head>
    31. <body>
    32. <!- blank.gif = beliebiges transparentes bild //-->
    33. <form method="post" action="">
    34. <table width="240" border="0" cellpadding="0" cellspacing="0" id="row" class="style.backgroundImage='url(leer.png)';height:8px;width:240px;">
    35. <tr>
    36. <td><img src="trans1x1.gif" height="8" width="240"></td>
    37. </tr>
    38. </table>
    39. <p>
    40. <input type="text" id="val" onKeyUp="isSecure(this.value)" />
    41. </p>
    42. </form>
    43. </body></html>
    Alles anzeigen


    MfG

    kingluui
  • Wo würdest Du denn den Schnipsel einfügen?

    Ich weiss ich bin in js ein bischen schwer von KP, mein Schwerpunkt liegt ehr auf PHP und so, aber ich will ja lernen, web2.0 finde ich faszinierend.

    In der Internet Professionell Zeitschrift war ein kürzerer Schnipsel für den Tastentimer, kann aber auch sein das sich der ganz oben gezeigte Code zu einem Framework gehört.

    Aber ich werde Deinen Vorschlag nochmal antesten.

    Danke für Deine Hilfe, macht spaß bei euch hier.

    MfG

    kingluui
  • ganz einfach: vor dem aufruf der isSecure() Methode

    Quellcode

    1. if(timer == 0) {
    2. //Die Zeit ist um, bitte abfragen
    3. if(document.getElementById('val').value.length > 5)
    4. isSecure(document.getElementById('val').value);
    5. Zeitaufschub();
    6. }


    aber denke nicht, dass javascript effekte etwas mit web2.0 zu tun haben.

    hast die "graulösung" mit dem farbigen hintergrundbild schon versucht?
  • Ich habe hier nochmal eine aktuelle Version des .js, wo ich halt nicht weiss, an welcher Stelle ich Deine vorgeschlagene Bedingung einpflegen kann, eine weiter Bedingung wäre, ein Absenden nur dann möglich zu machen, wenn in der isEmail() grünes Licht gegeben ist:

    Quellcode

    1. function pruefenreg1()
    2. {
    3. res = true;
    4. a = document.formreg1;
    5. if(a.regun.value == ''){res = false;}
    6. if(a.regup.value == ''){res = false;}
    7. if(a.regup.value.length < 8){res = false;}
    8. if(a.sendval.value == ''){res = false;}
    9. if(a.regemail.value == ''){res = false;}
    10. if(a.regemail.value.indexOf('@') == -1){res = false;}
    11. if(a.regemail.value.length < 8){res = false;}
    12. if(res == false){alert('Bitte Formular vollständig ausfüllen!')}
    13. return res;
    14. }
    15. function isUser(digitUser) {
    16. try {
    17. req = window.XMLHttpRequest?new XMLHttpRequest():
    18. new ActiveXObject("Microsoft.XMLHTTP");
    19. } catch (e) {
    20. //Kein AJAX Support
    21. }
    22. req.onreadystatechange = function () {
    23. if ((req.readyState == 4) && (req.status == 200)) {
    24. //getreu dem fall, dass das element einen integerwert liefert
    25. var regun = eval(req.responseText);
    26. document.getElementById('rowUser').style.width = regun;
    27. if(regun == 0)
    28. document.getElementById('rowUser').style.backgroundImage = 'url(buntes/safeunigreen.png)';
    29. else
    30. document.getElementById('rowUser').style.backgroundImage = 'url(buntes/safeunired.png)';
    31. }};
    32. req.open("GET", 'seiten/getUser.php?User='+ digitUser);
    33. req.send(null);
    34. }
    35. function isSecure(digitSecPass) {
    36. try {
    37. req = window.XMLHttpRequest?new XMLHttpRequest():
    38. new ActiveXObject("Microsoft.XMLHTTP");
    39. } catch (e) {
    40. //Kein AJAX Support
    41. }
    42. req.onreadystatechange = function () {
    43. if ((req.readyState == 4) && (req.status == 200)) {
    44. //getreu dem fall, dass das element einen integerwert liefert
    45. var regup = eval(req.responseText);
    46. document.getElementById('rowPass').style.width = regup;
    47. if(regup == 0)
    48. document.getElementById('rowPass').style.backgroundImage = 'url(buntes/safered.png)';
    49. else if((regup >= 1) && (regup <= 24))
    50. document.getElementById('rowPass').style.backgroundImage = 'url(buntes/safered.png)';
    51. else if((regup >= 25) && (regup <= 49))
    52. document.getElementById('rowPass').style.backgroundImage = 'url(buntes/safered.png)';
    53. else if((regup >= 50) && (regup <= 74))
    54. document.getElementById('rowPass').style.backgroundImage = 'url(buntes/safeyel.png)';
    55. else
    56. document.getElementById('rowPass').style.backgroundImage = 'url(buntes/safegreen.png)';
    57. }};
    58. req.open("GET", 'seiten/getSecPass.php?SecPass='+ digitSecPass);
    59. req.send(null);
    60. }
    61. function isEmail(digitEmail) {
    62. try {
    63. req = window.XMLHttpRequest?new XMLHttpRequest():
    64. new ActiveXObject("Microsoft.XMLHTTP");
    65. } catch (e) {
    66. //Kein AJAX Support
    67. }
    68. req.onreadystatechange = function () {
    69. if ((req.readyState == 4) && (req.status == 200)) {
    70. //getreu dem fall, dass das element einen integerwert liefert
    71. var regemail = eval(req.responseText);
    72. document.getElementById('rowEmail').style.width = regemail;
    73. if(regemail == 0)
    74. document.getElementById('rowEmail').style.backgroundImage = 'url(buntes/safeunigreen.png)';
    75. else
    76. document.getElementById('rowEmail').style.backgroundImage = 'url(buntes/safeunired.png)';
    77. }};
    78. req.open("GET", 'seiten/getEmail.php?checkEmail='+ digitEmail);
    79. req.send(null);
    80. }
    Alles anzeigen


    Wie Du im oberen Teil sehen kannst, habe ich eine kleine Formvalidierung eingepfegt, leider ist die sehr unkomfortabel, da gibt es doch sicherlich was Besseres, oder?

    Hier nachmal zwei Balken in Uni.

    MfG

    kingluui
    Bilder
    • safeunired.png

      146 Byte, 120×6, 3.944 mal angesehen
    • safeunigreen.png

      146 Byte, 120×6, 3.968 mal angesehen
  • hi, hab deine php funktion mal durch diese hier ersetzt: http://forenblogger.de/2006/08/18/passwort-sicherheit-ermitteln/

    hier der komplette code
    html datei:

    Quellcode

    1. <html><head>
    2. <script type="text/javascript">
    3. <!--
    4. var update = 0;
    5. var runner = null;
    6. function Timer() {
    7. if(0 < update && update < new Date().getTime()) {
    8. update = new Date().getTime()*2;
    9. var ob = document.getElementById('checkpw');
    10. isSecure(ob.value);
    11. }
    12. runner = setTimeout("Timer()", 250);
    13. }
    14. function Zeitaufschub() {
    15. if(runner==null) {
    16. runner = setTimeout("Timer()", 250);
    17. }
    18. update = (new Date().getTime())+1000;
    19. }
    20. function isSecure(digit) {
    21. try {
    22. var req = window.XMLHttpRequest ? new XMLHttpRequest():
    23. new ActiveXObject("Microsoft.XMLHTTP");
    24. } catch (e) {
    25. //Kein AJAX Support
    26. }
    27. req.onreadystatechange = function () {
    28. if ((req.readyState == 4) && (req.status == 200)) {
    29. //getreu dem fall, dass das element einen integerwert liefert
    30. var val = eval(req.responseText);
    31. document.getElementById('percentage').innerHTML = val
    32. document.getElementById('row').style.width = val;
    33. }};
    34. req.open("GET", 'func.php?s='+ digit);
    35. req.send(null);
    36. }
    37. //-->
    38. </script>
    39. </head>
    40. <body>
    41. <!- blank.gif = beliebiges transparentes bild //-->
    42. <img src="blank.gif" id="row" alt="" style="height:20px;width:10px;border:1px solid #afafaf" /> <span id="percentage"></span>%
    43. <form method="post" action="">
    44. <input type="text" id="checkpw" onkeyup="Zeitaufschub();" />
    45. </form>
    46. </body></html>
    Alles anzeigen


    func.php

    Quellcode

    1. <?php
    2. require('PasswordSecurity.php');
    3. echo new PasswordSecurity(urldecode($_GET['s']));
    4. ?>


    PasswordSecurity.php

    Quellcode

    1. <?php
    2. /**
    3. Script zur einfachen Erstellung und Pr�fung von Passw�rtern
    4. Copyright (C) 2006 - Mathias Bank
    5. Dieses Programm ist freie Software. Sie k�nnen es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation
    6. ver�ffentlicht, weitergeben und/oder modifizieren, gem�� Version 2 der Lizenz.
    7. Die Ver�ffentlichung dieses Programms erfolgt in der Hoffnung, da� es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne
    8. die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT F�R EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
    9. Zum heutigen Stand ist die Lizenz zu finden unter http://www.gnu.de/gpl-ger.html
    10. �nderungen
    11. - String-Zugriff laut Doku nicht mit eckigen, sondern mit geschweiften Klammern
    12. - Bug in Security-Test behoben
    13. */
    14. class PasswordSecurity {
    15. const PASSWORD_CHECK_TOO_SMALL=10000;
    16. const PASSWORD_CHECK_NO_BIG_CHAR=10001;
    17. const PASSWORD_CHECK_NO_SMALL_CHAR=10002;
    18. const PASSWORD_CHECK_NO_NUMBERIC_CHAR=10003;
    19. const PASSWORD_CHECK_NO_SPECIAL_CHAR=10004;
    20. const PASSWORD_CHECK_SAME_CHAR_SEQUENCE=10005;
    21. const PASSWORD_CHECK_ALPHABETICAL_SEQUENCE=10006;
    22. const PASSWORD_CHECK_KEYBOARD_SEQUENCE=10007;
    23. const PASSWORD_CHECK_NUMERICAL_SEQUENCE=10008;
    24. const PASSWORD_CHECK_LEXICON_WORD=10009;
    25. private $rating = 0;
    26. private $vowels = "aeiou";
    27. private $consonants = "bcdfghjklmnprstvwxz";
    28. private $specialchars = '!#$%&*+-/<=>?@^_~';
    29. private $alphabet = "abcdefghijklmnopqrstuvqxyz0123456789";
    30. private $keybordSequences = array("qwe","wer","ert","asd","sdf","dfg","yxc",'xcv','cvb','trz','tzu','yui','uio','iop','fgh','ghj','hjk','jkl','vbn','bnm','!"�','"�$','�$%',
    31. '$%&','%&/','&/(','/()','()=',')=?');
    32. private $numberSequences = array("137","379","973","731","246","468","159","357","753","951","846","461");
    33. /**
    34. * pr�ft die Sicherheit eines Passworts
    35. * Dabei wird gepr�ft ob,
    36. * - Das Passwort in einem Lexikon steht (sofern pspell installiert)
    37. * - Das Passwort eine Mindestl�nge erreicht
    38. * - Das Passwort aus Gro�-/Keinbuchstaben, Zahlen und Sonderzeichen besteht
    39. * - identische Zahlenfolgen enth�lt (mind.3)
    40. * - Tastatur-Sequenzen enth�lt (mind. 3)
    41. * - Zahlen-Sequenzen enth�lt (mind. 3)
    42. * - Alphabet-Elemente enth�lt (mind. 3)
    43. * @param string $password: zu pr�fendes Passwort
    44. * @param array $failureArray: Array zur Ermittlung, warum Punkte abezogen wurden
    45. * @param array $language: Array mit Sprach-K�rzeln, die mittels pspell gepr�ft werden sollen
    46. * @param int $optimalPasswordLength: optimale L�nge des Passworts
    47. * @return int: 0=sehr schlecht, 100=sehr gut
    48. */
    49. public function PasswordSecurity(&$password,&$failureArray=array(),$language=array("de"),$optimalPasswordLength=10) {
    50. //Rating initialisieren
    51. $rating = 100;
    52. $passwordLength=strlen($password);
    53. $smallPassword = strtolower($password); //Zum Vergleich mit Reihen
    54. //passwort ist deutsches oder englisches wort => aspell => Durchfallkriterium
    55. if(function_exists("pspell_new")) {
    56. foreach($language as $lang) {
    57. $pspellLink = pspell_new($lang);
    58. if (pspell_check($pspellLink, $password)) {
    59. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_LEXICON_WORD;
    60. return 0;
    61. }
    62. }
    63. }
    64. //pro fehlendem Zeichen auf Passwort-L�nge: 5 Punkte abziehen
    65. $dif = $optimalPasswordLength-$passwordLength;
    66. if ($dif>0) {
    67. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_TOO_SMALL;
    68. $rating = $rating - ($dif*5);
    69. }
    70. //wenn kein Kleinbuchstaben/Gro�buchstaben/Zahlen/Sonderzeichenoder jeweils 20 abziehen
    71. //besondere Zeichen werden nicht ber�cksichtigt
    72. $smallChar = false;
    73. $bigChar=false;
    74. $numericChar=false;
    75. $specialChar=false;
    76. for($i=0;$i<$passwordLength;$i++) {
    77. $ascii = ord($password[$i]);
    78. if ($ascii>=48 && $ascii<=57) $numericChar=true;
    79. elseif ($ascii>=65 && $ascii<=90) $bigChar=true;
    80. elseif ($ascii>=97 && $ascii<=122) $smallChar=true;
    81. elseif ($ascii>=32 && $ascii<=126) $specialChar=true;
    82. }
    83. if(!$smallChar) {
    84. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_NO_SMALL_CHAR;
    85. $rating -=20;
    86. }
    87. if(!$bigChar) {
    88. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_NO_BIG_CHAR;
    89. $rating -=20;
    90. }
    91. if(!$numericChar) {
    92. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_NO_NUMBERIC_CHAR;
    93. $rating -=20;
    94. }
    95. if(!$specialChar) {
    96. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_NO_SPECIAL_CHAR;
    97. $rating -=20;
    98. }
    99. //identische Zeichenfolgen suchen (ab 3 Buchstaben) => 20 Punkte abziehen
    100. for ($i=0;$i<=$passwordLength-3;$i++) {
    101. $excerpt = substr($smallPassword,$i,3);
    102. if ($excerpt[0]==$excerpt[1] && $excerpt[1] == $excerpt[2]) {
    103. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_SAME_CHAR_SEQUENCE;
    104. $rating -=20;
    105. break;
    106. }
    107. }
    108. //Zeichenfolgen auf der Tastatur (ab 3 Buchstaben) => 20 Punkte abziehen
    109. foreach($this->keybordSequences as &$sequence) {
    110. if (strstr($smallPassword, $sequence)) {
    111. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_KEYBOARD_SEQUENCE;
    112. $rating -=20;
    113. break;
    114. }
    115. }
    116. //Zahlenmuster
    117. foreach($this->numberSequences as &$sequence) {
    118. if (strstr($smallPassword, $sequence)) {
    119. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_NUMERICAL_SEQUENCE;
    120. $rating -=20;
    121. break;
    122. }
    123. }
    124. //ABC oder Zahlenreihen (ab 3 Buchstaben) => 20 Punkte abziehen
    125. for ($i=0;$i<=$passwordLength-3;$i++) {
    126. $excerpt = substr($smallPassword,$i,3);
    127. if(strstr($this->alphabet,$excerpt)) {
    128. $failureArray[] = PasswordSecurity::PASSWORD_CHECK_ALPHABETICAL_SEQUENCE;
    129. $rating -=20;
    130. break;
    131. }
    132. }
    133. $this->rating = ($rating>0)?$rating:0;
    134. }
    135. /**
    136. * outputs the rating
    137. */
    138. public function __toString() {
    139. return ''.$this->rating;
    140. }
    141. }
    142. ?>
    Alles anzeigen