On Sam, 03 Aug 2002 at 20:49 (+0200), Andre Heine wrote:
Am Samstag, 3. August 2002 20:24 schrieb Thorsten Haude:
* Jan Trippler
[02-08-03 17:06]: On Sam, 03 Aug 2002 at 10:45 (+0200), Thorsten Haude wrote:
[...] Ich linke mich jetzt mal dazu :))
Nebenbei: Du betreibst Demagogie, Du behauptest nämlich implizit, dass die Verwendung von strcmp() Bufferprobleme verursacht - womit Du immer noch allein bist.
IMHO sollte man bei C99 lieber strncmp, strncat, strncpy, usw. verwenden.
Sorry, ich kenne leider den ganzen Thread nicht. Durch strcmp() können IMHO Puffer Überläufe passieren, man sollte gerade bei der string Verarbeitung aufpassen.
Sorry, das sind Gemeinplätze. Schau Dir den Anfang des Threads an, damit Du verstehst, wie diese Diskussion zustande kam. BTW: man sollte bei der Programmierung immer aufpassen - nicht nur bei Strings (um auch mal einen Gemeinplatz beizusteuern).
Jedenfalls wenn man mit Sockets arbeitet, ein Server kann einem soetwas sehr übel nehmen.
JEDES Programm nimmt Buffer Overflows übel. Es führt in den meisten Fällen zu einer ungewollten Programmfortführung (oder -beendigung).
ZITAT: "Es ist bemerkenswert, wie viele Einbrüche durch einen Hacker zustande kamen, der so viele Daten sendete, daß der Server-Aufruf von sprintf Puffer zum Überlaufen brachte. Weitere Funktionen, mit denen wir vorsichtig sein sollten, sind gets, strcat,strcpy. Statt dessen sollten wir üblicherweise fgets, strncat und strncpy verwenden. Zusätzliche Hinweise zum Aufbau von sicheren Netzwerkenprogrammen finden Sie im Kapitel 23 von[Garfinkel und Spafford 1996]"
Aus dem Buch "Programmieren von UNIX-Netzwerken", Hanser Verlag.
Was meinst Du, warum strcmp in diesem Zitat nicht auftaucht ... Zu dem Zitat: Es geht hier IMHO um eine bestimmte Art von Stringhandling: Die Zuweisung von Werten unbekannter Herkunft an einen String. Alle diese Funktionen haben gemeinsam, dass sie die Quell-Strings ungeprüft (bis zum ersten auftretenden 0 - sic!) an das Ziel übergeben. Es wird keine Prüfung durchgeführt, ob die Deklaration des Zielpuffers ausreichend ist - das geht aus 2 Gründen nicht: - die aufgerufene Funktion kennt die Deklaration nicht (sie kriegt einen Pointer als Parameter) - die Größe kann zur Compile-Zeit unbekannt sein (dynamische Puffer). Der Buffer Overflow tritt aus genau einem Grund auf: Der Programmierer hat einen String aus unsicherer Quelle nicht ausreichend geprüft. Wenn das geschieht, kann man diese Funktionen auch einsetzen. Ein Schutz kann u. a. mit Hilfe von strncat, strncpy, fgets passieren, die eine Maximallänge zu kopierender Zeichen erwarten; denkbar sind aber auch Konstrukte wie: while (i < sizeof buf) *(buf + i++) = fgetc(file); oder: sprintf (format, "%%-.%ds", sizoef (buf) - 1); sprintf (buf, format, eingabe); oder: ...
IMHO ist das genauso mit strcmp(), mag mich aber täuschen...
Was bringt Dich auf diesen Gedanken? Alle im Zitat genannten Funktionen weisen Strings Werte zu, str(n)cmp vergleicht Strings. strcmp ist nur dann ein Risiko, wenn einer der beiden Parameter nicht sauber nullterminiert ist. Und dann kann strcmp eben einfach durch den Speicher sausen und bei der ersten Unstimmigkeit (oder 0!) anhalten. Wenn ich ein Programm baue, dem erst an dieser Stelle auffällt, das da was nicht stimmen könnte - ... Zum x-ten Mal: Die Diskussion begann, als Thorsten Haude behauptete, man könne sich nicht sicher sein, ob strcmp() am Stringende (Wert des Bytes = 0) aufhört zu vergleichen - und das ist nun mal Quatsch!
Ich behaupte nur, daß ich darüber nicht nachdenken will, und darum strncmp verwende, wenn es sich irgendwie einrichten läßt.
ACK.
NACK! Wenn ich anfange, in Programmen nicht mehr über die Zweckmäßigkeit dieser (strcmp) oder jener (strncmp) Funktion nachzudenken, dann sollte ich mir einen anderen Job suchen. Wie im Thread bereits mehrmals erwähnt bedeutet der Einsatz von strncmp immer, dass ich mir Gedanken darüber machen muss, wie weit ich den Vergleich laufen lasse. Das kann einfach sein (statische Strings, wohldefinierte Größen), kann aber im Falle von dynamisch erzeugten Strings auch ziemlich aufwändig werden - vor allem dann, wenn ich diese Berechnung sehr oft machen muss.
Wenn es nur ein einziger, oder wenige Vergleiche sind, so ist das sicherlich egal. Aber gerade Vergleiche können sehr, sehr häufig vorkommen. Denk mal an Sortierprogramme.
Server z.B., DOS Attacken, etc...
Was sollen uns diese Begriffe jetzt sagen? Jan