3 Stimmen

Secure C und die Universitäten - trainiert für Pufferüberlauf

Ich habe vor kurzem einen Universitätskurs in C absolviert, daher fehlt mir natürlich die Erfahrung.

Einige Universitäten neigen dazu, ihren Studenten sicheres Programmieren beizubringen, oder zumindest einige Elemente . Es gibt sogar ein Video (entnommen aus ici ).

Das Kopieren von Strings in C erfordert - soweit ich weiß - die Funktionen strcpy oder string.h. Wie verwenden Sie es sicher in der alltäglichen Programmierung? Gibt es Funktionen, die die Zuweisung so handhaben, dass Pufferüberläufe verhindert werden? Es gibt die CERT-Standard für sichere Kodierung für C . Sie bietet Beispiele und konforme Lösungen:

int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[128];
  strcpy(prog_name, argv[0]);
  /* ... */
}

Und ihre Alternative ist:

int main(int argc, char *argv[]) {
  /* ... */
  char *prog_name = (char *)malloc(strlen(argv[0])+1);
  if (prog_name != NULL) {
    strcpy(prog_name, argv[0]);
  }
  else {
    /* Couldn't get the memory - recover */
  }
  /* ... */
}

Entnommen von hier, 2. Beispiel .

Aber soweit ich das verstehe, ist das nur eine größere Herausforderung, mehr Code, mehr Arbeit. Warum ändert niemand die Bibliothek selbst? Oder warum stellt zumindest niemand eine sichere alternative Bibliothek oder Funktionen bereit, die das richtig handhaben?

Vielen Dank für die Lektüre, wishi

9voto

sth Punkte 210180

Die Posix-Funktion hierfür (die auf fast jedem System verfügbar ist) lautet strdup() . strcpy() wird verwendet, wenn man keinen neuen Speicher zuweisen möchte und bereits einen Puffer hat, den man verwenden möchte, aber dann sollte man besser wissen, wie groß dieser Puffer ist und ob die Zeichenfolge hineinpasst. Wenn Sie nicht wissen, ob die Zeichenkette hineinpasst, gibt es strncpy() die einfach eine bestimmte Anzahl von Zeichen kopiert. So können Sie die kopierte Menge auf die Größe Ihres Puffers beschränken.

Darüber hinaus gibt es eine Vielzahl von Sting-Bibliotheken, die String-Größen auf unterschiedliche Weise verwalten.

Und da Sie es mit C++ gekennzeichnet haben: Es gibt std::string die die gesamte Speicherverwaltung für Sie übernimmt und Ihnen diese Probleme erspart.

2voto

David Schmitt Punkte 56455

Verwenden Sie strncpy :

#define BUFSIZE 127
int main(int argc, char *argv[]) {
  /* ... */
  char prog_name[BUFSIZE + 1];
  strncpy(prog_name, argv[0], BUFSIZE);
  progname[BUFSIZE]= '\0';
  /* ... */
}

Es gibt *n* Versionen für die meisten str* Funktionen.

2voto

Die l (strlcpy, strlcat) Funktionen von OpenBSD sind in der Regel besser als die n Funktionen sind sie schneller und einfacher zu verwenden, aber sie sind nicht standardisiert. Sie sind jedoch BSD-lizenziert, so dass Sie eine bekannt gute Implementierung in jedes Programm einbinden können, so dass Sie sowohl plattformübergreifend als auch sicher sein können.

Für Windows, wenn Sie sich nicht um die Portabilität kümmern, können Sie *_s-Funktionen verwenden.

1voto

Uri Punkte 86472

Wenn ich Sie richtig verstehe, lautet Ihre eigentliche Frage, warum die API-Funktionen nicht sicherer gemacht werden.

Ein Grund dafür ist, dass die C-Bibliothek veraltet ist (zu spät, um sie jetzt zu ändern).

Der Hauptgrund dafür ist jedoch, dass die Bibliothek minimalistisch konzipiert ist, d. h. sie tut nur das Nötigste und es liegt in der Verantwortung des Benutzers, dafür zu sorgen, dass sie korrekt aufgerufen wird. Würde sie übermäßig viele Prüfungen durchführen, müsste bei jedem Aufruf ein Preis gezahlt werden, auch wenn der Benutzer aus anderen Gründen sicher sein kann, dass kein Problem auftreten wird. Dies ist bei vielen APIs sehr häufig der Fall.

Abgesehen davon gibt es genügend Bibliotheken, die sicherere Alternativen bieten, sie sind nur nicht Teil der Standardbibliothek. Außerdem arbeiten viele Leute, die Dinge auf höherer Ebene tun, mit C++, die Standard-Klassenbibliotheken für viele dieser Dinge hat.

0voto

OregonGhost Punkte 22841

Tatsächlich hat Microsoft sichere Alternativen zu den CRT-Funktionen angeboten. Jeder, den ich kenne, hasst sie jedoch und deaktiviert die Warnung, dass man die alten Funktionen nicht verwenden sollte. Wenn Sie etwas Sicheres wollen, sollten Sie vielleicht C++ verwenden. Und dann entweder STL-Strings oder etwas wie Qt.

Nun, oder Sie gehen zu Plattformen wie .NET oder Java, die in der Regel nicht unter diesen Problemen leiden (Ihre Anwendung könnte abstürzen, aber es gibt keine Möglichkeit, Code durch einen Pufferüberlauf in Ihre Anwendung einzuspeisen).

Bearbeiten: Mit aktivierter Datenausführungsverhinderung / NX (Standard für Vista und .NET) sollte dies auch für herkömmliche Plattformen kein Problem sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X