Passwort mit Sonderzeichen

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

  • Passwort mit Sonderzeichen

    Hallo,

    ich muss mich mit meiner App auf einem Web-Server per NSURLConnection/ POST anmelden.

    Das funktionierte bis jetzt ohne Probleme.

    Lag sicher daran, dass bis jetzt kein "wildes" Passwort verwendet wurde.

    Jetzt hat doch tatsächlich ein Kunde ein sicheres Passwort und kann sich über die App nicht einloggen.

    Das Passwort besteht unter anderem aus solchen Zeichen:

    Quellcode

    1. |%<">{}¥^~


    Ich habe jetzt testweise einen User angelegt und genau das obige Passwort vergeben um das mal zu testen.
    Das Passwort gebe ich in meiner App in einem UITextField per "Copy und paste" ein. (macht der Kunde genau so)

    Auf dem Server habe ich das in einer Weboberfläche des Servers getestet. Es funktioniert.

    Ich hab mir dann gedacht, dass ich die Zeichen bestimmt noch für den POST "wandeln" muss und mache das wie folgt:

    Quellcode

    1. NSString *escapedString = [self.passwordOutlet.text stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];

    der String sieht dann so aus: %7C%25%3C%22%3E%7B%7D%C2%A5%5E~

    und versuche dann den login:

    C-Quellcode

    1. NSString *userName = self.usernameOutlet.text;
    2. NSString *userPassword = self.passwordOutlet.text;
    3. NSString *escapedString = [self.passwordOutlet.text stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
    4. userPassword = escapedString;
    5. NSString *post = [NSString stringWithFormat:@"login=%@&password=%@",userName,userPassword];
    6. NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    7. NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];
    8. NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    9. [request setURL:[NSURL URLWithString:@"http://XXXXXXXX/login"]];
    10. [request setHTTPMethod:@"POST"];
    11. [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    12. [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    13. [request setHTTPBody:postData];
    14. NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    Alles anzeigen


    Tja, was soll ich sagen? Mit einfachen Passwörtern funktioniert es. mit dem komplexeren Passwort funktioniert es nicht.

    Hat jemand eine Idee was ich falsch mache?
    Ich habe auch keine Loesung, aber ich bewundere das Problem!
    _____________________________________________________


    Hape42

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hape42 () aus folgendem Grund: Tippfehler

  • Du solltest ja eh nicht das Passwort selber übertragen. Hast du die Möglichkeit den Webserver anzupassen? Dann ändere ihn so, dass du nur den hash an den Server schickst. Sowohl beim registrieren als auch beim einloggen. Das ist sicherer und du hast die Sonderzeichen vorher schon umgewandelt.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Du solltest ja eh nicht das Passwort selber übertragen. Hast du die Möglichkeit den Webserver anzupassen? Dann ändere ihn so, dass du nur den hash an den Server schickst. Sowohl beim registrieren als auch beim einloggen. Das ist sicherer und du hast die Sonderzeichen vorher schon umgewandelt.

    Gruß

    Claus
    Das sollte doch mit HTTPS nicht mehr so wild sein.
  • matz schrieb:

    Thallius schrieb:

    Du solltest ja eh nicht das Passwort selber übertragen. Hast du die Möglichkeit den Webserver anzupassen? Dann ändere ihn so, dass du nur den hash an den Server schickst. Sowohl beim registrieren als auch beim einloggen. Das ist sicherer und du hast die Sonderzeichen vorher schon umgewandelt.

    Gruß

    Claus
    Das sollte doch mit HTTPS nicht mehr so wild sein.

    Ich schrieb ja auch nur "Ist sicherer", nicht das es anders unsicher ist.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • hape42 schrieb:

    Ist leider nicht mein Server ‍
    Das einzige was mir dann noch einfällt wäre zu versuchen das ganze nicht als URL zu escapen (Also mit den %20...) sonder mal in Unicodes zu wandeln. Sieh mal hier

    atom.io/packages/ascii-unicode-escape

    Ist halt die Frage ob der server das versteht.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Michael schrieb:

    Ich vermute mal, dass du da ein Problem mit dem Encoding hast. Das Zeichen ¥ ist ja kein ASCII-Zeichen.
    ich konnte das weiter eingrenzen.

    ein Passwort wie zB |%<>{}^~ funktioniert ohne Problem mit meinem Code

    ¥ ist der Bösewicht

    aber eine Lösung habe ich noch nicht :rolleyes:
    Ich habe auch keine Loesung, aber ich bewundere das Problem!
    _____________________________________________________


    Hape42
  • MyMattes schrieb:

    hape42 schrieb:

    aber eine Lösung habe ich noch nicht :rolleyes:
    Hast Du @Chris' Tipp denn ausprobiert? Gerade ¥ dürfte mit ASCII-Encoding scheitern, bei UTF-8 dürfte es aber kein Problem sein. Wenn Du dann dem Server diesen Content-Type im Header mitgibst, wäre ich recht optimistisch :)
    Mattes
    Ja, grade eben. Hat auch nicht geholfen.
    Aber ich will mal nicht ausschliessen, dass ich mal ein paar Schritte zurücktreten muss um mir das nochmals anzusehen. Hab jetzt jede Menge versucht. Da bring ich jetzt erst mal wieder Struktur rein. <X
    Ich habe auch keine Loesung, aber ich bewundere das Problem!
    _____________________________________________________


    Hape42
  • hab jetzt mal alle meine Versuche weggeräumt und nur den Ansatz von Chris geändert:

    das :

    Quellcode

    1. [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];



    habe ich so geändert:

    Quellcode

    1. [request setValue:@"application/charset=UTF-8" forHTTPHeaderField:@"Content-Type"];

    leider keine Verbesserung.

    Aber ich gebe auch zu, mangels Wissen fische ich hier im Trüben <X

    das :

    Quellcode

    1. NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    habe ich so geändert:

    Quellcode

    1. NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    Ich habe auch keine Loesung, aber ich bewundere das Problem!
    _____________________________________________________


    Hape42
  • Nur ein Nebenaspekt, der dein Problem nicht löst: Ich glaube, dass du NO bei allowLossyConversion haben möchtest!
    Wenn das ¥ (oder ein anderes Zeichen) dabei verloren geht, gibt es darauf ansonsten keinen Hinweis.
    Es sollen doch alle Zeichen des Passwortes übertragen werden, oder? Wenn nicht ist das eben ein Fehler.
  • hape42 schrieb:

    hab jetzt mal alle meine Versuche weggeräumt und nur den Ansatz von Chris geändert:

    das :

    Quellcode

    1. [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];





    habe ich so geändert:

    Quellcode

    1. [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    leider keine Verbesserung.
    Ich mache das so:

    C-Quellcode

    1. [request addValue: @"text/xml; charset=utf-8" forHTTPHeaderField: @"Content-Type"];
    2. NSData *bodyData = [bodyString dataUsingEncoding: NSUTF8StringEncoding];
    Bist du sicher dass die Logindaten im Request gesendet werden? Könnte ja auch in authentication Challenge sein.


    C-Quellcode

    1. - (void) URLSession: (NSURLSession *)session
    2. task: (NSURLSessionTask *)task
    3. didReceiveChallenge: (NSURLAuthenticationChallenge *)challenge
    4. completionHandler: (void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
    5. {
    6. if (challenge.previousFailureCount == 0)
    7. {
    8. NSURLCredential *credential = [NSURLCredential credentialWithUser: self.username password: self.password persistence: NSURLCredentialPersistenceForSession];
    9. completionHandler (NSURLSessionAuthChallengeUseCredential, credential);
    10. }
    11. else
    12. {
    13. // handle the fact that the previous attempt failed
    14. NSLog(@"%s: challenge.error = %@", __FUNCTION__, challenge.error);
    15. completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
    16. }
    17. }
    Alles anzeigen
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • hape42 schrieb:

    vielen Dank für die Unterstützung.

    Nicht, dass Ihr denkt jetzt meldet er sich nicht mehr.

    Bin jetzt an der Algarve und das ohne Gerät zum Coden.

    Werde versuchen danach Eure Tipps umzusetzen.
    Da kommt bei mir ein klein bisschen Neid auf. Viel Spaß dort.
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.