-
ESP8266WebServer.h als alternative Lösung
Beispiel: http://.../xxxx.htm?uname=uschi
Code:
ESP8266WebServer webserver(80); //Webserver-Instanz für Port 80 erstellen
String filename = webserver.uri(); //Liefert "xxxx.htm"
String par1 = webserver.arg(F("uname")); //Liefert "uschi"
Wenn Du als Webseite nur "/" angibst, liefert webserver.arg(F("uname")); ebenfalls "uschi" und webserver.uri() liefert "/".
Mit ESP8266WebServer.h lassen sich Parameter sehr einfach abfragen. Du kannst jeden beliebigen Parameter abfragen, die Anzahl Parameter ermitteln etc.
Allerdings verwendest Du WiFiServer, auf Port 80.
Allerdings kannst Du auch eine Instanz von ESP8266WebServer auf Port 80 erstellen und dann so die Argumente auslesen.
Der erste Parameter wird an eine Webseite immer mit ? übergeben und jeder weitere mit &.
-
ja, das mit ESP8266WebServer webserver.arg("uname") weiß ich und nutze ich auch für die Verbindung zu meinen Clients (Port 8081):
ESP8266WebServer lanserver(8081);
(ich habe ja beide libs eingebunden), aber ich wüsste nicht, wie mein Code umgestrickt werden müsste, damit auch die websites zusätzlich mit ESP8266WebServer statt mit WiFiServer laufen.
Immerhin aber funktioniert doch cstringarg korrekt, er findet alle Suchstrings korrekt in allen testcodes, in meinem speziellen Fall steht da ja auch
&upwd=yy
drin, und auch das wird gefunden, also wo ist das Problem dann?
Was macht das Programm bei dir, wenn du es compilierst und ausführst, ggf. mit weiteren Serial.println zum debuggen?
- - - Aktualisiert - - -
den cstrinarg code habe ich jetzt umgestrickt auch für '?', trotzdem der alte upwd Fehler:
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
strcpy(sarg,"");
strcpy(needle, kini);
strcat(needle, vname);
strcat(needle, kequ);
pos = strstrpos(haystack, needle);
if(pos==-1) {
needle[0]='?';
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 evtl mit Fehlern ?upwd0=QMARKupwd0&upwd1=testupwd1&upwd2=testupwd2 &upwd13=testupwd13&upwd224=testupwd224 EndeTststring";
char argstring[64]="";
cstringarg(htmlstring, "upwd0", argstring);
Serial.print("upwd0 >>"); Serial.print(argstring); Serial.println("<< soll: >>QMARKupwd0<<");
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<<");
cstringarg(htmlstring, "upwd9", argstring);
Serial.print("upwd9 >>"); Serial.print(argstring); Serial.println("<< soll: >><< (// not found)");
}
void loop() {
}
wo also liegt das TOP Problem, wenn der Eingabestring anfangs identisch, aber insgesamt zu lang ist?
-
Ich denke, Du machst eine neue Instanz: ESP8266WebServer nocheinwebserver(80); //Webserver-Instanz für Port 80 erstellen
Und wenn Du auf Deine Argumente abfragen willst, operierst Du dann mit: nocheinwebserver.arg(F("uname"));
Wobei man wohl nicht vergessen darf, auch ein nocheinwebserver.handleClient(); einzubauen.
-
das ist mir jetzt zu kompliziert mit einer zusätzlichen ESP8266WebServer instanz, und man kann ja WiFiServer nicht durch ESP8266WebServer ersetzen , insb. hat ja 'class ESP8266WebServer' keine Methode 'available' etc.
cstringarg funktioniert jetzt einwandfrei, auch mit '?', ich brauche also auch kein ESP8266WebServer webserver.arg("uname")
hast du es jetzt mal gestartet und nach dem Fehler gesucht?
-
er bringt auf jeden fall Hinweise:
Code:
C:\Users\TT\Documents\Arduino\sketch_aug19a\sketch_aug19a.ino: In function 'void handleNotAuthorized()':
C:\Users\TT\Documents\Arduino\sketch_aug19a\sketch_aug19a.ino:218:43: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
cstringarg(strinput, "uname", struname); // uname
^
C:\Users\TT\Documents\Arduino\sketch_aug19a\sketch_aug19a.ino:219:41: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
cstringarg(strinput, "upwd", strupwd); // upwd
^
aber meldet sich nicht am Router an.
-
das sind doch keine Fehler, es läuft trotzdem.
-
Moment ... jetzt ... Anmeldung hat funkt.
Wenn ich auf den Server gehe, kommt die Seite, dann gebe ich Passwort "manfred" ein und bekomme diese Ausgabe:
Code:
strupwd >>><<<
website_upwd>>>yy<<<
G
strupwd >>><<<
website_upwd>>>yy<<<
E
strupwd >>><<<
website_upwd>>>yy<<<
T
strupwd >>><<<
website_upwd>>>yy<<<
strupwd >>><<<
website_upwd>>>yy<<<
/
strupwd >>><<<
website_upwd>>>yy<<<
?
strupwd >>><<<
website_upwd>>>yy<<<
u
strupwd >>><<<
website_upwd>>>yy<<<
n
strupwd >>><<<
website_upwd>>>yy<<<
a
strupwd >>><<<
website_upwd>>>yy<<<
m
strupwd >>><<<
website_upwd>>>yy<<<
e
strupwd >>><<<
website_upwd>>>yy<<<
=
strupwd >>><<<
website_upwd>>>yy<<<
&
strupwd >>><<<
website_upwd>>>yy<<<
u
strupwd >>><<<
website_upwd>>>yy<<<
p
strupwd >>><<<
website_upwd>>>yy<<<
w
strupwd >>><<<
website_upwd>>>yy<<<
d
strupwd >>><<<
website_upwd>>>yy<<<
=
strupwd >>><<<
website_upwd>>>yy<<<
m
strupwd >>>m<<<
website_upwd>>>yy<<<
a
strupwd >>>ma<<<
website_upwd>>>yy<<<
n
strupwd >>>man<<<
website_upwd>>>yy<<<
f
strupwd >>>manf<<<
website_upwd>>>yy<<<
r
strupwd >>>manfr<<<
website_upwd>>>yy<<<
e
strupwd >>>manfre<<<
website_upwd>>>yy<<<
d
strupwd >>>manfred<<<
website_upwd>>>yy<<<
strupwd >>>manfred<<<
website_upwd>>>yy<<<
H
strupwd >>>manfred<<<
website_upwd>>>yy<<<
T
strupwd >>>manfred<<<
website_upwd>>>yy<<<
T
strupwd >>>manfred<<<
website_upwd>>>yy<<<
P
strupwd >>>manfred<<<
website_upwd>>>yy<<<
/
strupwd >>>manfred<<<
website_upwd>>>yy<<<
1
strupwd >>>manfred<<<
website_upwd>>>yy<<<
.
strupwd >>>manfred<<<
website_upwd>>>yy<<<
1
strupwd >>>manfred<<<
website_upwd>>>yy<<<
strupwd >>>manfred<<<
website_upwd>>>yy<<<
Bei Eingabe von "yy":
Code:
strupwd >>><<<
website_upwd>>>yy<<<
G
strupwd >>><<<
website_upwd>>>yy<<<
E
strupwd >>><<<
website_upwd>>>yy<<<
T
strupwd >>><<<
website_upwd>>>yy<<<
strupwd >>><<<
website_upwd>>>yy<<<
/
strupwd >>><<<
website_upwd>>>yy<<<
?
strupwd >>><<<
website_upwd>>>yy<<<
u
strupwd >>><<<
website_upwd>>>yy<<<
n
strupwd >>><<<
website_upwd>>>yy<<<
a
strupwd >>><<<
website_upwd>>>yy<<<
m
strupwd >>><<<
website_upwd>>>yy<<<
e
strupwd >>><<<
website_upwd>>>yy<<<
=
strupwd >>><<<
website_upwd>>>yy<<<
&
strupwd >>><<<
website_upwd>>>yy<<<
u
strupwd >>><<<
website_upwd>>>yy<<<
p
strupwd >>><<<
website_upwd>>>yy<<<
w
strupwd >>><<<
website_upwd>>>yy<<<
d
strupwd >>><<<
website_upwd>>>yy<<<
=
strupwd >>><<<
website_upwd>>>yy<<<
y
strupwd >>>y<<<
website_upwd>>>yy<<<
y
strupwd >>>yy<<<
website_upwd>>>yy<<<
GET /?uname=&upwd=yy HTTP/1.1
Dann kommt die richtige Seite, weil angemeldet und bei Klicken auf Logout kehrt er zurück zur Login-Seite.
-
ja,
so sollte es auch sein.
auf user name wird noch nicht geprüft in dieser debug-Version, hier werden noch alle möglichen Eingaben akzeptiert.
yy
ist dann auch das korrekte Passwort für alle User.
allerdings wird eben auch
yy67
als korrekt akzeptiert, was nicht sein dürfte (IMO)
- - - Aktualisiert - - -
PS,
Finden kann er hier uname und struname auch noch nicht im html string, da dort ja '?uname=' steht und nicht '&uname=', was aber nachrangig ist, da ja auch noch nicht darauf geprüft wird.
- - - Aktualisiert - - -
PS,
hier ist die neue cstringarg Version mit testcode, wo auch ?varname= neben &varname= akzeptiert wird:
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
strcpy(sarg,"");
strcpy(needle, kini);
strcat(needle, vname);
strcat(needle, kequ);
pos = strstrpos(haystack, needle);
if(pos==-1) {
needle[0]='?';
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 evtl mit Fehlern ?upwd0=QMARKupwd0&upwd1=testupwd1&upwd2=testupwd2 &upwd13=testupwd13&upwd224=testupwd224 EndeTststring";
char argstring[64]="";
cstringarg(htmlstring, "upwd0", argstring);
Serial.print("upwd0 >>"); Serial.print(argstring); Serial.println("<< soll: >>QMARKupwd0<<");
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<<");
cstringarg(htmlstring, "upwd9", argstring);
Serial.print("upwd9 >>"); Serial.print(argstring); Serial.println("<< soll: >><< (// not found)");
}
void loop() {
}
-
So wie ich das sehe wird in einer Schleife der String zusammengesetzt vom Parameter upwd. Und nach jedem Zeichen wird geprüft, ob das Password stimmt. Irgendwann gibt es eine Übereinstimmung und die restlichen Zeichen des gesendeten Passwords werden nicht mehr berücksichtigt. Erst muss der gesamte String zusammen sein, von upwd. Dann erst darf geprüft werden.
Hier sieht man das:
Code:
strupwd >>><<<
website_upwd>>>yy<<<
y
strupwd >>>y<<<
website_upwd>>>yy<<<
y
strupwd >>>yy<<<
website_upwd>>>yy<<<
GET /?uname=&upwd=yy11111111111111 HTTP/1.1
-
ja, den Verdacht hatte ich ja auch schon, aber wie kann man das ändern`?