Sicherheitsfunktionen in der CRT

Viele alte CRT-Funktionen liegen in neueren, sichereren Versionen vor. Wenn eine sichere Funktion vorhanden ist, wird die ältere, weniger sichere Version als veraltet markiert, und die neue Version hat das _s-Suffix („sicher“).

In diesem Kontext bedeutet "veraltet", dass die Verwendung der -Funktion nicht empfohlen wird. Dies bedeutet nicht, dass die Funktion aus der CRT entfernt werden soll.

Die sicheren Funktionen verhindern oder korrigieren keine Sicherheitsfehler. Stattdessen fangen sie Fehler ab, wenn sie auftreten. Es werden zusätzliche Überprüfungen auf Fehlerbedingungen durchgeführt. Wenn ein Fehler auftritt, wird ein Fehlerhandler aufgerufen (siehe Parametervalidierung).

Beispielsweise kann die strcpy Funktion nicht erkennen, ob die kopierte Zeichenfolge für den Zielpuffer zu groß ist. Seine sichere Entsprechung, strcpy_s , nimmt die Größe des Puffers als Parameter an. Sie kann also ermitteln, ob ein Pufferüberlauf auftritt. Wenn Sie strcpy_s verwenden, um 11 Zeichen in einen Puffer mit 10 Zeichen zu kopieren, ist dies ein Fehler, der Ihren strcpy_s Fehler nicht beheben kann. Es kann jedoch Ihren Fehler erkennen und Sie informieren, indem der Handler für ungültige Parameter ausgelöst wird.

Beseitigen von Ablaufwarnungen

Es gibt mehrere Möglichkeiten, um Ablaufwarnungen für die älteren, weniger sicheren Funktionen zu beseitigen. Die einfachste Möglichkeit ist, _CRT_SECURE_NO_WARNINGS zu definieren oder das _CRT_SECURE_NO_WARNINGS-Pragma zu verwenden. Beide deaktivieren veraltete Warnungen, aber die Sicherheitsprobleme, die die Warnungen verursacht haben, sind weiterhin vorhanden. Es ist besser, veraltete Warnungen aktiviert zu lassen und die neuen CRT-Sicherheitsfeatures zu nutzen.

In C++ besteht die einfachste Möglichkeit darin, sichere Vorlagenüberladungenzu verwenden. Dadurch werden veraltete Warnungen in vielen Fällen vermieden, indem Aufrufe veralteter Funktionen durch Aufrufe sicherer Versionen dieser Funktionen ersetzt werden. Ein Beispiel ist dieser veraltete Aufruf von strcpy:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

Durch Definieren von _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES als 1 wird die Warnung beseitigt, indem der strcpy-Aufruf in strcpy_s geändert wird, was Pufferüberläufe verhindert. Weitere Informationen finden Sie unter Sichere Vorlagenüberladungen.

Für diese veralteten Funktionen ohne sichere Vorlagenüberladungen sollten Sie definitiv erwägen, den Code manuell zu aktualisieren, um die sicheren Versionen zu verwenden.

Eine andere Quelle von Ablaufwarnungen, unabhängig von der Sicherheit, sind POSIX-Funktionen. Ersetzen Sie POSIX-Funktionsnamen durch Ihre Standardentsprechungen (ändern Sie z.B. access in _access), oder deaktivieren Sie POSIX-bezogene Ablaufwarnungen durch Definieren von . Weitere Informationen finden Sie unter Kompatibilität.

Zusätzliche Sicherheitsfunktionen

Zu den Sicherheitsfeatures gehören:

  • Parameter Validation. Sichere Funktionen und viele ihrer unsicheren Gegenstücke überprüfen Parameter. Die Überprüfung kann Folgendes umfassen:

    • Überprüfen auf NULL-Werte.
    • Überprüfung von Enumerationswerten auf Gültigkeit.
    • Überprüfen, ob ganzzahlige Werte im gültigen Bereiche liegen.
  • Weitere Informationen finden Sie unter Parametervalidierung.

  • Auf einen Handler für ungültige Parameter kann auch der Entwickler zugreifen. Wenn eine Funktion auf einen ungültigen Parameter stößt, anstatt die Anwendung zu bestätigen und zu beenden, können Sie diese Probleme über _set_invalid_parameter_handler überprüfen, _set_thread_local_invalid_parameter_handler.

  • Sized Buffers. Sie müssen die Puffergröße an jede sichere Funktion übergeben, die in einen Puffer schreibt. Die sicheren Versionen überprüfen, ob der Puffer groß genug ist, bevor in ihn geschrieben wird. Dies hilft, gefährliche Pufferüberlauffehler zu vermeiden, die die Ausführung von schädlichem Code ermöglichen könnten. Diese Funktionen geben in der Regel einen Fehlercode zurück errno und rufen den Handler für ungültige Parameter auf, wenn die Größe des Puffers zu klein ist. Funktionen, die wie gets aus Eingabepuffern lesen, haben sichere Versionen, die von Ihnen die Angabe einer maximalen Größe fordern.

  • Null termination. Einige Funktionen, die potenziell nicht beendete Zeichenfolgen hinterlassen, verfügen über sichere Versionen, die sicherstellen, dass Zeichenfolgen ordnungsgemäß NULL-terminiert sind.

  • Enhanced error reporting. Die sicheren Funktionen geben Fehlercodes mit mehr Fehlerinformationen zurück, als für die bereits vorhandenen Funktionen verfügbar waren. Die sicheren Funktionen und viele der bereits vorhandenen Funktionen legen nun fest errno und geben häufig auch einen errno Codetyp zurück, um eine bessere Fehlerberichterstattung zu ermöglichen.

  • Filesystem security. Sichere Datei-E/A-APIs unterstützen sicheren Dateizugriff im Standardfall.

  • Windows security. Sichere Prozess-APIs setzen Sicherheitsrichtlinien durch und lassen die Angabe von ACLs zu.

  • Format string syntax checking. Ungültige Zeichenfolgen werden erkannt, z.B. Verwendung falscher Typfeldzeichen in printf-Formatzeichenfolgen.

Siehe auch

Parametervalidierung
Sichere Vorlagenüberladungen
C-Laufzeitdateien (CRT) und STL-Dateien (C++-Standardbibliothek)