Warum werden strlcpy und strlcat als unsicher angesehen?
Ich verstehe, dass strlcpy
und strlcat
entworfen wurden, als sicherer Ersatz für strncpy
und strncat
. Einige Menschen sind jedoch immer noch der Meinung, dass Sie unsicher ist, und einfach dass eine andere Art von problem.
Kann mir jemand ein Beispiel geben, wie mit strlcpy
oder strlcat
(d.h. eine Funktion, die immer null beendet seine Saiten) kann zu Sicherheitsproblemen führen?
Ulrich Drepper und James Antill Zustand, das ist wahr, aber nie Beispiele oder diesen Punkt klären.
InformationsquelleAutor der Frage Anonymous | 2010-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens
strlcpy
hat nie beabsichtigt, als eine sichere versionstrncpy
(undstrncpy
hat nie beabsichtigt, als eine sichere versionstrcpy
). Diese beiden Funktionen sind völlig unabhängig.strncpy
ist eine Funktion, die hat keine Beziehung zu C-strings (d.h. null-terminierte strings). Die Tatsache, dass es dasstr...
Präfix in seinem Namen ist nur ein historischer Fehler. Die Geschichte und der Zweck derstrncpy
ist gut bekannt und gut dokumentiert. Dies ist eine Funktion erstellt für die Arbeit mit so genannten "fixed width" - Saiten (nicht mit C-strings) in einigen historischen Versionen von Unix-Datei-system. Einige Programmierer heute verwirrt durch seinen Namen und davon ausgehen, dassstrncpy
ist irgendwie dienen soll, als beschränkt-Länge C-string kopieren-Funktion (eine "sichere" Geschwister vonstrcpy
), die in der Realität völliger Unsinn und führt zu schlechter Programmierstil. C standard-Bibliothek in Ihrer heutigen form hat keine Funktion für begrenzte Länge C-string zu kopieren, zu löschen. Dies ist, wostrlcpy
passt.strlcpy
ist in der Tat ein wahres limited-Länge kopieren-Funktion erstellt für die Arbeit mit C-strings.strlcpy
richtig tut alles, was eine begrenzte Länge kopieren-Funktion tun sollte. Die einzige Kritik, die man anstreben kann, ist, dass es ist, leider, nicht standard.Zweitens
strncat
auf der anderen Seite, ist in der Tat eine Funktion, arbeiten mit C-strings und führt eine begrenzte Länge Verkettung (es ist in der Tat eine "sichere" Geschwister vonstrcat
). Um diese Funktion nutzen zu richtig, der Programmierer hat einige Besondere Pflege, da der size-parameter diese Funktion übernimmt, ist nicht wirklich die Größe des Puffers, erhält das Ergebnis, sondern eher die Größe von seinem übrigen Teil (also, das terminator-Zeichen gezählt wird implizit). Dies könnte verwirrend sein, da, um zu binden, dass die Größe, um die Größe des Puffers, Programmierer merken Sie einige zusätzliche Berechnungen, die Häufig verwendet, um Kritik an derstrncat
.strlcat
kümmert sich um diese Themen, und ändern der Oberfläche, so dass keine zusätzlichen Berechnungen nötig sind (zumindest in den aufrufenden code). Nochmal, die einzige Grundlage, die ich sehen, man kann kritisieren, das ist, dass die Funktion nicht standard ist. Auch die Funktionen ausstrcat
Gruppe ist etwas, das Sie nicht sehen in der professionellen code sehr oft aufgrund der eingeschränkten Verwendbarkeit der Idee der rescan-basierte string-Verkettung.Wie diese Funktionen können zu Sicherheitsproblemen führen... Sie können es einfach nicht. Sie können nicht mit Sicherheit Probleme in stärkerem Maße als bei der C-Sprache selbst kann "zu Sicherheitsproblemen führen". Sie sehen, für eine Weile, es war eine starke Stimmung aus, dass es die Sprache C++ hat sich zu bewegen in die Richtung der Entwicklung in einige seltsame Geschmack von Java. Dieses Gefühl manchmal schwappt in die Domäne der C-Sprache so gut, was eher unbedarft und gezwungen, die Kritik der C-Sprache-Funktionen und die Funktionen der C-standard-Bibliothek. Ich vermute, dass könnten wir es mit etwas zu tun, so dass in diesem Fall so gut, obwohl ich hoffe doch die Dinge sind nicht wirklich schlecht.
InformationsquelleAutor der Antwort AnT
Ulrich ' s Kritik basiert auf der Idee, dass ein string abschneiden, die nicht vom Programm erkannt, kann zu Sicherheitsproblemen führen, die durch eine fehlerhafte Logik. Daher, um sicher zu sein, müssen Sie prüfen, die für das abschneiden. Das für die string-Verkettung bedeutet, dass Sie tun, eine überprüfung entlang der Linien von:
Nun
strlcat
hat effektiv diese Kontrolle, wenn der Programmierer merkt sich das Ergebnis überprüfen - so dass Sie kann es sicher nutzen:Ulrich der Punkt ist, dass, da Sie zu
destlen
undsourcelen
um (oder neu berechnen Ihnen, wasstrlcat
effektiv ist), Sie könnte genauso gut verwenden Sie einfach die effizienterememcpy
sowieso:(Im obigen code
dest_maxlen
ist die maximale Länge der Zeichenfolge, die gespeichert werden können indest
- eine weniger als die Größe derdest
Puffer.dest_bufferlen
ist die volle Größe desdest buffer
).InformationsquelleAutor der Antwort caf
Wenn die Leute sagen, "
strcpy()
ist gefährlich, verwenden Siestrncpy()
statt" (oder ähnliche Aussagen überstrcat()
etc., aber ich werde zu verwendenstrcpy()
hier mein Fokus), Sie bedeuten, dass es keine bounds-Check-instrcpy()
. Also einen überlangen string wird das Ergebnis in buffer overruns. Sind Sie richtig. Mitstrncpy()
in diesem Fall wird verhindert Pufferüberläufe.Ich das Gefühl, dass
strncpy()
wirklich nicht beheben Fehler: es löst ein problem, das leicht vermieden werden kann, von einem guten Programmierer.Als C-Programmierer sind, Sie muss kennen die Ziel-Größe, bevor Sie versuchen, Sie zu kopieren strings. Das ist die Annahme, in
strncpy()
undstrlcpy()
's Letzte Parameter zu: Sie liefern, dass die Größe zu Ihnen. Sie können auch wissen, die Quelle der Größe vor dem kopieren von strings. Dann, wenn das Ziel nicht groß genug, nicht nennenstrcpy()
. Entweder den Puffer neu zuordnen, oder etwas anderes tun.Warum weiss ich auch nicht wie
strncpy()
?strncpy()
ist eine schlechte Lösung in den meisten Fällen: die Zeichenfolge wird gekürzt ohne Ankündigung—eher würde ich zusätzlichen code schreiben, um dies herauszufinden mich und dann nehmen Sie den Verlauf der Aktion, die ich nehmen will, anstatt lassen Sie eine Funktion für mich entscheiden, was zu tun ist.strncpy()
ist sehr ineffizient. Er schreibt, um jedes byte im Ziel-Puffer. Sie nicht brauchen, die Tausende von'\0'
am Ende Ihr Ziel.'\0'
wenn das Ziel nicht groß genug. Also, Sie müssen so tun Sie sich selbst sowieso. Die Komplexität, dies zu tun, ist nicht der Mühe Wert.Nun, wir kommen zu
strlcpy()
. Die änderungen vonstrncpy()
es besser machen, aber ich bin nicht sicher, ob das spezifische Verhalten vonstrl*
sichert Ihre Existenz: Sie sind viel zu spezifisch. Haben Sie immer noch wissen die Ziel-Größe. Es ist effizienter alsstrncpy()
weil es nicht unbedingt schreiben, um jedes byte in das Ziel. Aber es löst ein problem, das gelöst werden können, indem Sie tun:*((char *)mempcpy(dst, src, n)) = 0;
.Ich glaube nicht, dass jemand sagt, dass
strlcpy()
oderstrlcat()
kann zu Sicherheitsproblemen führen, was Sie (und ich) sagen, dass Sie in Fehler, zum Beispiel, wenn Sie erwarten, dass die vollständige Zeichenfolge geschrieben werden, anstatt ein Teil von Ihr.Die wichtigste Frage hier ist: wie viele bytes zu kopieren? Die Programmierer müssen das wissen und wenn er es nicht tut,
strncpy()
oderstrlcpy()
nicht, ihn zu retten.strlcpy()
undstrlcat()
sind nicht standard, weder ISO-C noch POSIX. So, Ihre Verwendung in portablen Programmen ist unmöglich. In der Tatstrlcat()
hat zwei verschiedene Varianten: die Solaris-Implementierung ist, anders als die anderen für edge-Fälle, die mit der Länge 0. Dies macht es noch weniger hilfreich als sonst.InformationsquelleAutor der Antwort Alok Singhal
Ich denke, Ulrich und andere denken, es gebe ein Falsches Gefühl der Sicherheit. Versehentlich abschneiden von strings kann haben Auswirkungen auf die Sicherheit für andere Teile des Codes (zum Beispiel, wenn ein file-system-Pfad abgeschnitten ist, das Programm möglicherweise nicht die Durchführung von Operationen auf die gewünschte Datei).
InformationsquelleAutor der Antwort jamesdlin
Gibt es zwei "Probleme" beziehen sich auf die Verwendung strl Funktionen:
um zu vermeiden abschneiden.
Den c1x-standard-Entwurf Schriftsteller und Drepper, argumentieren, dass der Programmierer nicht den Rückgabewert überprüfen. Drepper sagt, wir sollen irgendwie wissen, die Länge und memcpy verwenden und vermeiden Sie die string-Funktionen zusammen, Die-Normen-Ausschuss argumentiert, dass der sichere strcpy sollte die Rückgabe ungleich null bei Kürzung, sofern nicht anders angegeben von der
_TRUNCATE
Flagge. Die Idee ist, dass Menschen sind eher zu verwenden, wenn(strncpy_s(...)).Einige Leute denken, dass die string-Funktionen sollte niemals Abstürzen, auch wenn fed-Schein-Daten. Dies betrifft die standard-Funktionen wie strlen, die unter normalen Bedingungen wird segfault. Der neue standard gehören viele solche Funktionen. Die Prüfungen haben natürlich auch Leistungseinbußen.
Den Kopf über die vorgeschlagenen standard-Funktionen ist, dass Sie wissen, wie viel Daten, die Sie verpasst mit strl Funktionen.
InformationsquelleAutor der Antwort jbcreix
Ich glaube nicht, dass
strlcpy
undstrlcat
sind betrachten unsicher oder zumindest ist es nicht der Grund, warum Sie sind nicht enthalten in glibc - nach allem, glibc enthält strncpy und sogar strcpy.Die Kritik, die Sie erhielten, war, dass Sie angeblich ineffizient, nicht unsicher.
Entsprechend der Sichere Mobilität Papier von Damien Miller:
Deshalb sind Sie nicht in der glibc, aber es ist nicht wahr, dass Sie nicht unter Linux verfügbar. Sie sind unter Linux in libbsd:
Sind Sie verpackt in Debian und Ubuntu und andere Distributionen. Sie können auch schnappen Sie sich ein kopieren und verwenden in Ihrem Projekt - es ist kurz, und unter eine freizügige Lizenz:
InformationsquelleAutor der Antwort rsp