Umlaute und Sonderzeichen werden in Passwortcheck nicht erkannt

ruNN0r

Erfahrenes Mitglied
Moin,
ich habe mal wieder ein kleines Problem:
Ich habe mit Ajax und PHP ein Tool zur überprüfung der Passwortsicherheit geschrieben.
Mein Problem ist das umlaute bzw. Sonderzeichen nicht richtig erkannt werde.
ich lasse in Ajax alles mit dem befehl "escape()" umwandeln und übergebe es per Post.
alle zu überprüfenden Zeichen sind in der PHP Datei ein einem array. z.b. array('a','b','c')
jedoch wenn da ein array(' ') ist erkennt der ein "+" und nicht den leerschritt wenn ich in den array einen '\+' packe erkennt der das gar nicht. und ein '+' dann ist jedes Zeichen für ihn ein Sonderzeichen... Naja schaut euch das Script selber mal an.

Besten Dank schonmal

zum Testen: http://michelhp.de/pw/pw.html

pw.js
PHP:
var resobjekt;
if(navigator.appName.search("Microsoft") > -1){
  resobjekt = new ActiveXObject("MSXML2.XMLHTTP");
}else{
  resobjekt = new XMLHttpRequest();
}
function sndReq() {
  resobjekt.open('post', 'pw.php' , true);
  resobjekt.onreadystatechange=handleResponse;
  resobjekt.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  resobjekt.send('daspw=' + escape(this.document.f.mypw.value));
}
function handleResponse(){
  if(resobjekt.readyState == 4){
    document.getElementById("ant").innerHTML = resobjekt.responseText;
  }
}

pw.php (bei $sonderzeichen und $umlaute ist das Problem: ich habe ein ' ' drin und er ekennt ein +)
PHP:
<?php
  //****************Einstellungen
  $standartpunkte=10;                                 //Punktzahl für alles außer Passwortlänge
  $pwlaenge=8;                                        //Die Länge des Passworts
  $p_max=$standartpunkte*5+$pwlaenge;                 //Gesamtpunktzahl wird errechnet
  
  //****************Funktionen
  function io($id,$meld_ja="Ja",$meld_nein="Nein"){
    if($id==1){
      return $meld_ja;
    }else{
      return $meld_nein;
    }
  }
  
  $pw=$_REQUEST['daspw'];                             //Passwort wird aus AJAX übermittlung gelesen
  $laenge=strlen($pw);                                //Passwortlänge wird bestimmt
  $pwarray=str_split($pw);                            //Passwort wird in einen Array gelegt
  if($laenge>=$pwlaenge){$laenge1=1;}else{$laenge1=0;}        //Erste Prüfung. Ist das Passwort länger als angegeben.
  //****************Kleinbuchstaben als Array zur überprüfung
  $buchstaben_klein=array('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'
                         );
  //****************Großbuchstaben als Array zur überprüfung
  $buchstaben_gross=array('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'
                         );
  //****************Zahlen als Array zur überprüfung
  $zahlen=array('0','1','2','3','4',
                '5','6','7','8','9'
               );
  //****************Umlaute und Leerzeichen als Array zur überprüfung
  $umlaute=array('ä','ö','ü','Ä','Ö','Ü');
  //****************Die beliebtesten Sonderzeichen als Array zur überprüfung
  $sonderzeichen=array(',' ,';' ,':' ,',' ,'-',
                       '_' ,'=' ,'\'','\/','\]',
                       '\?','\^','&' ,'!' ,'\.' ,
                       '@' ,'\$','£' ,'#' ,'\*' ,
                       '\(','\)','\.' ,'%' ,'~' ,
                       '<' ,'>' ,'\{' ,'\}' ,'\[',' '
                      );
  //****************Buchstaben-/Zahlenfolgen 3er Sätze als Array zur überprüfung
  $folgezeichen=array('abc','bcd','cdf','def','efg',
                      'fgh','ghi','hij','ijk','jkl',
                      'klm','lmn','mno','nop','opq',
                      'pqr','qrs','rst','stu','tuv',
                      'uvw','vwx','wxy','xyz',
                      '123','234','345','456','567',
                      '678','789'
                     );
  //****************Buchstabenfolgen der Tastatur 3er Sätze als Array zur überprüfung
  $folgezeichen_tasta=array('qwe','wer','ert','rtz','tzu',
                            'zui','uio','iop','opü','asd',
                            'sdf','dfg','fgh','ghj','hjk',
                            'jkl','klö','löä','yxc','xcv',
                            'cvb','vbn','bnm','qay','wsx',
                            'edc','rfv','tgb','zhn','ujm'
                           );
  //****************Überprüfen ob kleinbuchstaben vorhanden sind
  foreach($buchstaben_klein as $buchstaben_klein1){
    $bkv=ereg($buchstaben_klein1,$pw);
    if($bkv>0){break;}
  }
  //****************Überprüfen ob großbuchstaben vorhanden sind
  foreach($buchstaben_gross as $buchstaben_gross1){
    $bgv=ereg($buchstaben_gross1,$pw);
    if($bgv>0){break;}
  }
  //****************Überprüfen ob Zahlen vorhanden sind
  foreach($zahlen as $zahlen1){
    $zv=ereg($zahlen1,$pw);
    if($zv>0){break;}
  }
  //****************Überprüfen ob Umlaute vorhanden sind
  foreach($umlaute as $umlaute1){
    $ulv=ereg($umlaute1,$pw);
    if($ulv>0){break;}
  }
  //****************Überprüfen ob Sonderzeichen vorhanden sind
  foreach($sonderzeichen as $sonderzeichen1){
    $szv=ereg($sonderzeichen1,$pw);
    if($szv>0){break;}
  }
  //****************Überprüfen ob Zeichen 3mal hintereinander vorhanden sind.
  for($i=0;$i<=$laenge;$i++){
    if($pwarray[$i]==$pwarray[$i+1] && $pwarray[$i]==$pwarray[$i+2] && (!empty($pwarray[$i]) || !empty($pwarray[$i1]) || !empty($pwarray[$i2]))){
      $zeichenfolge=0;break;
    }else{
      $zeichenfolge=1;
    }
  }
  //****************Überprüfen ob Buchstaben-/Zahlenfolgen vorhanden sind
  foreach($folgezeichen as $folgezeichen1){
    $fzv=eregi($folgezeichen1,$pw);
    if($fzv>0){break;}
  }
  //****************Überprüfen ob Buchstaben-/Zahlenfolgen der Tastatur vorhanden sind
  foreach($folgezeichen_tasta as $folgezeichen_tasta1){
    $fztv=eregi($folgezeichen_tasta1,$pw);
    if($fztv>0){break;}
  }

  if($laenge>$pwlaenge){                               //-->
  $p_pwlaenge=$pwlaenge;}else{$p_pwlaenge=$laenge;}    //Wenn die Länge des Passworts $pwlaenge übersteigt, gibt es trozdem nur die Punkte der $pwlaenge
  $p_bkv=io($bkv,$standartpunkte,0);                   //-->
  $p_bgv=io($bgv,$standartpunkte,0);                   //-->
  $p_zv=io($zv,$standartpunkte,0);                     //-->
  $p_szv=io($szv,$standartpunkte,0);                   //-->
  $p_ulv=io($ulv,$standartpunkte,0);                   //Punkte festlegen anhand der oberen Anweisungen
  $p_zeichenfolge=io($zeichenfolge,0,-$standartpunkte);//-->
  $p_fzv=io($fzv,-$standartpunkte,0);                  //-->
  $p_fztv=io($fztv,-$standartpunkte,0);                //Punkte festlegen anhand der oberen Anweisungen (diese 3 im Minusbereich)

  //****************Errechnen wieveiel Punkte erreicht wurden
  $erreicht=$p_pwlaenge+$p_bkv+$p_bgv+$p_zv+$p_szv+$p_ulv+$p_zeichenfolge+$p_fzv+$p_fztv;
  
  //****************Ausgabe der Ergebnisse
  echo"
    <table border='1' cellpadding='0' cellspacing='0'>
      <tr>
        <td bgcolor='#999999'><b>Beschreibung</b></td>
        <td bgcolor='#999999'><b>Status</b></td>
        <td bgcolor='#999999'><b>Moegliche Punkte</b></td>
        <td bgcolor='#999999'><b>Punkte erreicht</b></td>
      </tr>
      <tr>
        <td>Passwort laenger als ".$pwlaenge." Zeichen</td>
        <td>".io($laenge1)."</td>
        <td>8 (1 pro Zeichen)</td>
        <td>".$p_pwlaenge."</td>
      </tr>
      <tr>
        <td>Kleine Buchstaben vorhanden</td>
        <td>".io($bkv)."</td>
        <td>$standartpunkte</td>
        <td>".$p_bkv."</td>
      </tr>
      <tr>
        <td>Grosse Buchstaben vorhanden</td>
        <td>".io($bgv)."</td>
        <td>$standartpunkte</td>
        <td>".$p_bgv."</td>
      </tr>
      <tr>
        <td>Zahlen vorhanden</td>
        <td>".io($zv)."</td>
        <td>$standartpunkte</td>
        <td>".$p_zv."</td>
      </tr>
      <tr>
        <td>Sonderzeichen vorhanden</td>
        <td>".io($szv)."</td>
        <td>$standartpunkte</td>
        <td>".$p_szv."</td>
      </tr>
      <tr>
        <td>Umlaute vorhanden</td>
        <td>".io($ulv)."</td>
        <td>$standartpunkte</td>
        <td>".$p_ulv."</td>
      </tr>
      <tr>
        <td>kein Zeichen mehrfach hintereinander</td>
        <td>".io($zeichenfolge)."</td>
        <td>-$standartpunkte</td>
        <td>".$p_zeichenfolge."</td>
      </tr>
      <tr>
        <td>Keine Zeichenfolgen wie \"abc\" oder \"123\"</td>
        <td>".io($fzv,"Nein","Ja")."</td>
        <td>-$standartpunkte</td>
        <td>".$p_fzv."</td>
      </tr>
      <tr>
        <td>Keine Tastaturzeichenfolgen wie \"qwe\" oder \"qay\"</td>
        <td>".io($fztv,"Nein","Ja")."</td>
        <td>-$standartpunkte</td>
        <td>".$p_fztv."</td>
      </tr>
      <tr>
        <td colspan=2><b>Gesamtpunkte:</b></td>
        <td><b>".$p_max."</b></td>
        <td><b>".$erreicht."</b></td>
      </tr>
    </table>
  ";

  //****************Prozente berechnen und Grafik ausgeben
  $prozent = $erreicht*100/$p_max;
  echo"
    Sicherheitsfaktor: ".number_format($prozent,'2',',','.')."%
    <table width='100' cellpadding='0' cellspacing='0'>
      <tr>
        <td height='30' width='100' background='verlauf.gif'>
  ";
          for($i=1;$i<floor($prozent);$i++){
            echo"<img src='blank.gif' title='Sicherheitsfaktor: ".number_format($prozent,'2',',','.')."%'>";
          }
            echo"<img src='black.gif' title='Sicherheitsfaktor: ".number_format($prozent,'2',',','.')."%'>";
  echo"
        </td>
      </tr>
    </table>
  ";
?>
 
Zuletzt bearbeitet:
Hast du dir mal das übergebene Passwort vor der Überprüfung ausgeben lassen? Vllt ist ja ein Zeichensatz konflikt vorhanden und die Sonderzeichen werden garnicht als welche erkannt?
 
ja habe ich. wenn ich ein + eingebe passiert nichts bzw ein [leerschritt] ist zu sehen und bei einem [leerschritt] passiert auch nix.
Verstehe nicht warum es nicht ankommt. habe den fehler auch schon in der *.js gesucht aber ich finde einfach nichts!

Habe es gerade nochmal getestet! habe etwas festgestellt. ein [leerschritt] und ein + werden beide als leerschritt erkannt! Das steht fest. denn wenn ich 2x ü und 1x [leerschritt] eingebe zeigt mir das script das 3x das gleiche zeichen hintereinander eingegeben wurde!

ich habe mir noch mehr durchgelesen! Aber ich finde einfach nicht den Fehler... habe es nun schon mit
PHP:
header('Content-Type: text/xml; charset=ISO-8859-1');
header("Content-Type: text/html; charset=utf-8");
versucht. Also mit beiden. Das hat zwar meine umlaute wieder sichtbar gemacht und ich hatte nicht mehr die ? aber das + ist immernoch nicht da!

Würde mich über eure Hilfe sehr freuen.
 
Moin,

verwende mal statt escape() jenes: encodeURIComponent()

Das kodiert im Gegenteil zu escape() auch das + , denn jenes steht(wie du bemerkt hast) bei der Übertragung von Argumenten per HTTP für ein Leerzeichen


http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_GET
Argumentübertragung [Bearbeiten]

Häufig will der Nutzer einer Website spezielle Informationen senden. Dazu stellt HTTP prinzipiell zwei Möglichkeiten zur Verfügung:

1. HTTP-GET: Die Daten sind Teil der URL und bleiben deshalb beim Speichern oder der Weitergabe des Links erhalten.
2. HTTP-POST: Übertragung der Daten mit einer speziell dazu vorgesehenen Anfrageart in den HTTP-Kopfdaten, so dass sie in der URL nicht sichtbar sind.

Die zu übertragenden Daten müssen ggf. URL-kodiert werden, d. h. reservierte Zeichen müssen mit „%<Hex-Wert>“ und Leerzeichen mit „+“ dargestellt werden.
 
Besten dank,
hat klasse funktioniert werde das fertige script nochmal anhängen wenn ich durch bin.

danke dir vielmals
 

Neue Beiträge

Zurück