- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 36

Thema: html code für User Login + password (esp8266 + Arduino IDE)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    updae:
    ich habe jetzt einen Code zusammengebastelt, der einigermaßen, aber noch nicht 100%ig funktioniert.
    Fürs erste teste ich nur aufs Passwort wegen der Debug-Phase.
    ist es völlig falsch, wird es zurückgewiesen, ist es 100% richtig, dann auch angenommen.

    Problem aber:
    wenn das Pwd zB "12345" ist, und der usr gibt "1234567" ein, wird es auch akzeptiert. Ich kriege nicht raus, wo der Fehler liegt.
    Wer weiß wo der Hase im Pfeffer liegt?

    Hier erst mal 2 Hilfsfunktionen, um Passwort etc. aus dem html-String rauszufischen (funktioniert ansonsten einwandfrei):

    Code:
    int16_t  strstrpos(char * haystack,  char * needle)   // find 1st occurance of substr in str
    {
       char *p = strstr(haystack, needle);
       if (p) return p - haystack;
       return -1;   // Not found = -1.
    }
    
    //----------------------------------------------------------------------------
    const int  MAXLEN = 1024;
    const int  TOKLEN = 64;
    
    char * cstringarg( char* haystack, char* vname, char* sarg ) {
       int i=0, pos=-1;
       unsigned char  ch=0xff;
       char  kini[3] = "&";       // start of varname: '&': 
       char  kequ[3] = "=";       // end of varname, start of argument: '='
       char  needle[TOKLEN]="";   // complete pattern:  &varname=abc1234
    
       //kequ[0] = '=';  // customize
       strcpy(sarg,"");
       strcpy(needle, kini);
       strcat(needle, vname);
       strcat(needle, kequ);
       pos = strstrpos(haystack, needle); 
       if(pos==-1) return sarg;
       pos=pos+strlen(vname)+2; // start of value = kini+vname+kequ   
       while( (ch!='&')&&(ch!='\0') ) {
          ch=haystack[pos+i];    
          if( (ch=='&')||(ch==';')||(ch==' ')||(ch=='\0') ||(ch=='\n')
            ||(i+pos>=strlen(haystack))||(i>TOKLEN-1) ) {
               sarg[i]='\0';
               return sarg;
          }       
          if( (ch!='&') ) {
              sarg[i]=ch;          
              i++;       
          }      
       } 
       return sarg;
    }
    und hier jetzt die eigentliche Website, die username und passwort anfordert zum Login:

    Code:
    char  website_uname[20]="abcde"; //  website user name 
    char  website_upwd[20]="12345"; // website user pwd 
    
    void handleNotAuthorized() {
      String readString="";
      char   strinput[MAXLEN], strupwd[TOKLEN], struname[TOKLEN];
    
      WiFiClient client = wifiserver.available();
    
      //---------------------------------------
    
      strcpy(strinput, "");
      strcpy(strupwd, "");
      strcpy(struname, "");
    
      while ( client.connected() ) {
        if (authorized) return;
        
        readString.toCharArray(strinput, MAXLEN);
    
        // cstringarg( char* haystack, char* vname, char* sarg )
        // haystack pattern: &varname=1234abc,  delimiters &, \n, \0, SPACE, EOF
        cstringarg(strinput, "uname", struname);  // uname
        cstringarg(strinput, "upwd", strupwd);   // upwd    
    
        if ( strlen(strupwd) == strlen(website_upwd)
             && strcmp(strupwd, website_upwd ) == 0)   {
          authorized = true;
          readString = "";
          return;
        }
    
        if ( client.available() ) {
          char c = client.read();
    
          //read char by request
          if (readString.length() < TOKLEN) {
    
            //store characters to string
            readString += c;
            //Serial.print(c);
          }
    
          //if HTTP request has ended
          if (c == '\n') {
            client.flush();
            Serial.println(readString);
    
            //now output html data header
    
            String script = "";
    
            script += ("HTTP/1.1 401 Log-In Required");
            script += ("Content-Type: text/html \n");
            script += ("\n");  //  do not forget this one //????
            script += ("<!DOCTYPE html> \n");
            script += ("<html> \n");
            script += ("<head> \n");
    
    
            // utf-8 für "°" Zeichen
            script +=  "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"> \n" ;
            script +=  "<title>" ;
            script +=  website_title ;
            script +=  "</title> \n" ;
            script +=  "</head> \n" ;
            script +=  "<body> \n" ;
    
            script += "<h1><p style=\"color:rgb(255,0,191);\"> " + (String)website_url ;
            script += (String)": &nbsp; <wbr> <wbr> " + "Not authorized !</p> </h1> \n" ;
            script += ("<h2><p style=\"color:rgb(255,0,191);\"> log in to proceed: </p> </h2> \n");
    
            script += ("<FORM ACTION='/' method=GET > \n");
            script += ("<h2>user name:  <INPUT TYPE=text NAME='uname' VALUE=''  MAXLENGTH='50'> </h2> \n");
            script += ("<h2>password :  <INPUT TYPE=PASSWORD NAME='upwd' VALUE='' MAXLENGTH='50'> </h2> \n");
    
            script += ("<h2><INPUT TYPE=SUBMIT></h2> \n");
    
            script += ("</FORM> \n");
            script += ("<BR> \n");
            script += ("</body> \n");
            script += ("</html> \n");
    
            client.print(script);
    
            //stopping client
            client.stop();
            delay(1);
    
            //clearing string for next read
            readString = "";
          }
        }
        delay(1);
      }
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Das if() funktioniert:

    Code:
    if (strlen(strupwd) == strlen(website_upwd)
             && strcmp(strupwd, website_upwd ) == 0) .....
    Wenn die Eingangsstrings korrekt sind. Also 12456 und 1234567, wird korrekt als falsch erkannt, sowie 123456 und 123456 als richtig.
    Also musst Du davor nach dem Problem suchen.

    Ich tippe hier auf das Problem, habe ich noch nicht richtig angeschaut:

    Code:
    cstringarg(strinput, "upwd", strupwd);   // upwd

  3. #3
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Das if() funktioniert:

    Code:
    if (strlen(strupwd) == strlen(website_upwd)
             && strcmp(strupwd, website_upwd ) == 0) .....
    Wenn die Eingangsstrings korrekt sind. Also 12456 und 1234567, wird korrekt als falsch erkannt, sowie 123456 und 123456 als richtig.
    Also musst Du davor nach dem Problem suchen.

    Ich tippe hier auf das Problem, habe ich noch nicht richtig angeschaut:

    Code:
    cstringarg(strinput, "upwd", strupwd);   // upwd
    hallo,
    das cstringarg habe ich als isolierte Funktion mit mehreren Teststrings geprüft, es hat immer den richtigen arg-Teilstring zurückgegeben, aber ich kann tatsächlich nicht ausschleißen, dass nicht doch irgendein verdeckter Bug drin steckt.
    Du hast ja auch völlig Recht, die Abfrage
    if (strlen(strupwd) == strlen(website_upwd)
    müsste diesen Fehler 12345 != 1234567 heraussieben.
    Die Ungleichheit "1245" != "12345" etc wird ja hingegen korrekt erkannt., und die Gleichheit "12345" == "12345" ebenfalls.

    Es sei denn die Länge wird nicht richtig ermittelt, z.B. wegen fehlender '\0' in den beiden cstrings (wofür ich allerdings auch keinen Anhaltspunkt habe),
    oder die Funktion macht bereits einen Vergleich auf Identität, ohne dass bereits "Enter" gedrückt wurde, und überspringt dabei die folgenden Eingaben - doch auch dafür sehe ich keinen Anlass.

    Es ist mir ein absolutes Rätsel.

    - - - Aktualisiert - - -



    update:
    hier ein testcode für cstringarg(), und er funktioniert bestens, sowohl mit direkt aneinanderhängenden als auch bei durch (fälschlich) mit Leerzeichen getrennten Teilstrings:

    Code:
    int16_t  strstrpos(char * haystack,  char * needle)   // find 1st occurance of substr in str
    {
       char *p = strstr(haystack, needle);
       if (p) return p - haystack;
       return -1;   // Not found = -1.
    }
    
    //----------------------------------------------------------------------------
    const int  MAXLEN = 1024;
    const int  TOKLEN = 64;
    
    char * cstringarg( char* haystack, char* vname, char* sarg ) {
       int i=0, pos=-1;
       unsigned char  ch=0xff;
       char  kini[3] = "&";       // start of varname: '&': 
       char  kequ[3] = "=";       // end of varname, start of argument: '='
       char  needle[TOKLEN]="";   // complete pattern:  &varname=abc1234
    
       //kequ[0] = '=';  // customize
       strcpy(sarg,"");
       strcpy(needle, kini);
       strcat(needle, vname);
       strcat(needle, kequ);
       pos = strstrpos(haystack, needle); 
       if(pos==-1) return sarg;
       pos=pos+strlen(vname)+2; // start of value = kini+vname+kequ   
       while( (ch!='&')&&(ch!='\0') ) {
          ch=haystack[pos+i];    
          if( (ch=='&')||(ch==';')||(ch==' ')||(ch=='\0') ||(ch=='\n')
            ||(i+pos>=strlen(haystack))||(i>TOKLEN-1) ) {
               sarg[i]='\0';
               return sarg;
          }       
          if( (ch!='&') ) {
              sarg[i]=ch;          
              i++;       
          }      
       } 
       return sarg;
    }
    
    void setup() {
      Serial.begin(115200);
      Serial.println();
      Serial.println("Test mit cstringarg()");
      Serial.println();
      
      char htmlstring[1024]="html teststring mit und ohne Leerzeichen &upwd1=testupwd1&upwd2=testupwd2 &upwd13=testupwd13&upwd224=testupwd224 EndeTststring";
      char argstring[64]="";
    
      cstringarg(htmlstring, "upwd1", argstring);
      Serial.print("upwd1 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd1<<");
    
      cstringarg(htmlstring, "upwd2", argstring);
      Serial.print("upwd2 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd2<<");
      
      cstringarg(htmlstring, "upwd13", argstring);
      Serial.print("upwd13 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd13<<");
    
      cstringarg(htmlstring, "upwd224", argstring);
      Serial.print("upwd224 >>"); Serial.print(argstring); Serial.println("<< soll: >>testupwd224<<"); 
       
    }
    
    void loop() {
      
    }
    das einzige, was ich vermuten würde, wäre daher etwas in der "Logik", wie die html-Seite aufgebaut ist und wie ihr html string mit dem Text der Eingabefelder zusammengesetzt, gesendet und ausgewertet wird.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Wenn man vor dem if(....) ein Serial.println(strupwd); macht, sieht man, was dort vor dem if ankommt. Man muss mal die beteiligten Variablen (Strings) ausgeben, dann sieht man mehr. Dann kann man auch gleich die Länge mit ausgeben (Serial.println(strlen(strupwd));)

  5. #5
    HaWe
    Gast
    dann sieht man nur das verkürzte pwd, also bei Eingabe im Textfeld
    "1234567"
    dann als strupwd nur "12345",
    und website_upwd auch "12345"

    d.h. hier kommen sie identisch an, obwohl strupwd eigentlich vorher länger war.
    im html String, steht es aber noch als &upwd=1234567
    Dabei funktioniert aber nach allen Tests ja cstringarg fehlerfrei.

    Mir ist die Logik des html-Codes und seiner Auswertung aber auch absolut schleierhaft: warum z.B. die Auswertung vor dem html Code steht, und was das ganze Brimborium mit client = wifiserver.available(); und client.available, client.flush und client.stop soll und der ganze Rest, und was ein "client" hier überhaupt ist und was wann macht.
    Geändert von HaWe (18.08.2018 um 14:51 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Wenn statt 1234567 nur 12345 ankommt, ist es doch nicht richtig, was cstringarg als Ergebnis liefert? website_upwd ist ja '12345', das ändert sich nicht, so weit ich das gesehen habe. Wichtig ist dann nur strupwd, was cstringarg liefert. Oder?

    Wenn Du mal website_upwd="abcde" schreibst, kommt dann als strupwd auch "12345" statt "1234567" oder kommt dann "abcde" vor dem if an?

  7. #7
    HaWe
    Gast
    genau, das strupwd wird aus dem html string mit cstringarg extrahiert, und cstringarg arbeitet aber korrekt nach allen Tests.
    Genau deshalb bin ich ja dermaßen ratlos.
    Es wird irgendwie mit dem Aufbau und der Logik des html codes und des wifi servers zu tun haben.

    Versuch du es dochmal selber mit ESP8266 und Arduino 1.8.5 zu debuggen, ich weiß nicht mehr, wo ich suchen soll.
    Ich kann dir gerne den kompletten lauffähigen Code hier posten.

Ähnliche Themen

  1. html-Code für nodeMCU mit Arduino IDE + Wifi libs
    Von HaWe im Forum Arduino -Plattform
    Antworten: 7
    Letzter Beitrag: 14.08.2018, 18:30
  2. Pegelwandler RX/TX Arduino ESP8266
    Von Cysign im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 05.02.2018, 23:29
  3. ESP8266 boards per per Arduino-IDE programmieren?
    Von HaWe im Forum Arduino -Plattform
    Antworten: 27
    Letzter Beitrag: 10.06.2017, 15:19
  4. arduino ide mit esp8266
    Von NotEvil im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 4
    Letzter Beitrag: 12.01.2017, 14:17
  5. HTML-Code (scripts)
    Von Technik =) im Forum Umfragen
    Antworten: 6
    Letzter Beitrag: 10.10.2008, 09:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress