malloc vs Überlauf
-
Hallo!
Ich schreibe an einem CGI-Script in C. Es soll mit der get-methode ein Formularinhalt übergeben werden (Post-Methode ist keine Option).
Bei der Getmethode ist die Eingabe in der Adresszeile sichtbar. Ich möchte verhindern, dass durch Manipulation durch den Benutzer Unvorhersehbares passiert.Die Eingabe wird per getenv eingelesen und ich habe dann meinen String und die Eingabe, die ich dann weiterverarbeiten kann:
//Import der Umgebungsvariable QUERY_STRING nach string char *Qstring; Qstring= (char *) (malloc(255)); Qstring=getenv("QUERY_STRING");
was passiert denn jetzt wenn durch den Benutzer ein String reinkommt, der 260 Zeichen lang ist. Bei meinem Probelauf ist nichts passiert(kein Absturz), aber darauf würde ich mich nicht so gerne verlassen. Ich wüsste schon gerne was da abläuft.
Kann mich da jemand aufklären, oder mir eine Quelle nennen, wo ich Informationen dazu finde.
Werden die 5 Zeichen dann abgeschnitten? Gibt es eine Möglichkeit eine zu lange Eingabe abzufangen?
Bin für jeden Hinweis dankbar.Beste Grüße
Bonobert
-
Also wenn wir hier in C sind dann kommt es bei
Qstring=getenv("QUERY_STRING");
nur zu einer Änderung des Pointers. Hier wird noch kein Byte kopiert, also kann es hier noch zu keinem Überschreiben kommen.Qstring zeigt dann eben nicht mehr auf den mit malloc reservierten Speicher. (macht eigentlich keinen Sinn)
Wenn Du den String kopieren willst könntest Du das mit strcpy machen und vorher mit strlen die Länge des Stings überprüfen.
-
bonobert schrieb:
//Import der Umgebungsvariable QUERY_STRING nach string char *Qstring; Qstring= (char *) (malloc(255)); Qstring=getenv("QUERY_STRING");
so könnts gehen, wenn du eine kopie brauchst
char *env, *Qstring; env = getenv("QUERY_STRING"); Qstring = malloc(strlen(env)+1); // +1 für die 0 und *kein* cast if (Qstring) { strcpy (Qstring, env); // OK // mach was mit Qstring ... free (Qstring); // am ende die kopie wieder wegschmeissen } else { // string zu lang oder 'out of memory' ... }
oder eine funktion, die kopien von allen env-strings machen kann
char *getenv_copy (char *name) { char *env, *Qstring = 0; env = getenv(name); if (env) Qstring = malloc(strlen(env)+1); if (Qstring) strcpy (Qstring, env); return Qstring; } ... // im hauptprogramm dann... char *p = getenv_copy ("QUERY_STRING"); if (p) { // string verarbeiten ... free (p); // und wech damit; } else { // fehler behandeln (oder nicht) ... }
ungetestet.
-
--- bitte meinen Beitrag löschen ---
-
supertux schrieb:
--- bitte löschen ---
wieso
findest du, dass mein posting so schlecht ist?
-
Ich glaube das bitte löschen bezog sich auf den von supertux selbstgeschriebenen Beitrag.
Danke für die schnellen Antworten.
Wenn ich das jetzt richtig sehe, dann hat es bei mir am Verständnis für getenv (Zeiger) gefehlt. Ich sehe jetzt klarer
Bei einer Lösung, wo ich mit einer (Teil-)Kopie arbeite, brauche ich mir ja dann wohl keine Gedanken um einen vom Benutzer provozierten Überlauf zu machen, da dies bei getenv geregelt sein sollte.
-
ja, um getenv musst du dir keine sorgen machen. du musst nur den speicher auf deiner seite sicher im griff habe. also wenn du statische speichergröße nutzt, immer diese größe beim kopieren mit angeben oder dynamische speichergröße nutzen, deren größe du vorher ermittelst.
-
fricky schrieb:
supertux schrieb:
--- bitte löschen ---
wieso
findest du, dass mein posting so schlecht ist?
hätte besser sagen sollen, was zu löschen galt: nämlich meinen Beitrag (weil ich ohne zu merken, dasselbe wie du und Babbage geschrieben habe.