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. Die neue Version weist das _s
Suffix ("secure") auf.
In diesem Kontext bedeutet "veraltet", dass die Verwendung der Funktion nicht empfohlen wird. Dies bedeutet nicht, dass die Funktion aus dem CRT entfernt wird.
Die sicheren Funktionen verhindern oder beheben keine Sicherheitsfehler. Stattdessen fangen sie Fehler ab, wenn sie auftreten. Sie führen zusätzliche Überprüfungen auf Fehlerbedingungen durch. Wenn ein Fehler vorliegt, rufen sie einen Fehlerhandler auf (siehe Parametervalidierung).
Beispielsweise kann die strcpy
Funktion nicht erkennen, ob die kopierte Zeichenfolge für den Zielpuffer zu groß ist. Die sichere Entsprechung strcpy_s
nimmt die Größe des Puffers als Parameter an. Daher kann ermittelt werden, ob ein Pufferüberlauf auftritt. Wenn Sie verwenden strcpy_s
, um 11 Zeichen in einen Puffer mit 10 Zeichen zu kopieren, ist dies ein Fehler, strcpy_s
der Ihren Fehler nicht korrigieren kann. Es kann jedoch Ihren Fehler erkennen und Sie informieren, indem sie den Handler für ungültige Parameter aufruft.
Beseitigen von Ablaufwarnungen
Es gibt mehrere Möglichkeiten, um Ablaufwarnungen für die älteren, weniger sicheren Funktionen zu beseitigen. Am einfachsten ist es, das warning
Pragma einfach zu definieren _CRT_SECURE_NO_WARNINGS
oder zu verwenden. Beides deaktiviert Warnungen zur Veraltung, 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++ ist die Verwendung von Secure-Vorlagenüberladungen die einfachste Möglichkeit, die Veraltetkeitswarnungen zu beseitigen. Die Überladungen beseitigen in vielen Fällen veraltete Warnungen. Sie ersetzen Aufrufe veralteter Funktionen durch Aufrufe sicherer Versionen der Funktionen. 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 Schützen von 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 Standardäquivalente (z. B. ändern access
Sie in _access
), oder deaktivieren Sie POSIX-bezogene Veraltetkeitswarnungen, indem Sie definieren _CRT_NONSTDC_NO_WARNINGS
. Weitere Informationen finden Sie unter Kompatibilität.
Weitere Sicherheitsfeatures
Zu den Sicherheitsfeatures gehören:
Parametervalidierung
Sichere Funktionen und viele ihrer unsicheren Entsprechungen überprüfen Parameter. Die Validierung kann Folgendes umfassen:
NULL
Überprüfen auf 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 trifft, können Sie diese Probleme über
_set_invalid_parameter_handler
oder_set_thread_local_invalid_parameter_handler
überprüfen, anstatt die Anwendung zu bestätigen und zu beenden.Größe von Puffern
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 sie in ihn schreiben. Die Überprüfung hilft dabei, gefährliche Pufferüberlauffehler zu vermeiden, die die Ausführung von bösartigem Code ermöglichen könnten. Diese Funktionen geben in der Regel einen
errno
Fehlercode zurück und rufen den Handler für ungültige Parameter auf, wenn die Größe des Puffers zu klein ist. Funktionen, die wiegets
aus Eingabepuffern lesen, haben sichere Versionen, die von Ihnen die Angabe einer maximalen Größe fordern.Null-Beendigung
Einige Funktionen, die potenziell nicht beendete Zeichenfolgen belassen, verfügen über sichere Versionen, die sicherstellen, dass Zeichenfolgen ordnungsgemäß NULL-beendet sind.
Erweiterte Fehlerberichterstattung
Die sicheren Funktionen geben Fehlercodes mit mehr Fehlerinformationen zurück, als bei den bereits vorhandenen Funktionen verfügbar waren. Die sicheren Funktionen und viele der bereits vorhandenen Funktionen legen jetzt fest
errno
und geben häufig auch einen Codetyp zurück, um eineerrno
bessere Fehlerberichterstattung zu ermöglichen.Dateisystemsicherheit
Sichere Datei-E/A-APIs unterstützen sicheren Dateizugriff im Standardfall.
Windows-Sicherheit
Sichere Prozess-APIs setzen Sicherheitsrichtlinien durch und lassen die Angabe von ACLs zu.
Formatzeichenfolgensyntaxüberprüfung
Ungültige Zeichenfolgen werden erkannt, z. B. wenn Sie falsche Typfeldzeichen in
printf
Formatzeichenfolgen verwenden.
Siehe auch
-Parametervalidierung
Sichere Vorlagenüberladungen
C-Runtime(CRT) und C++-Standardbibliotheksdateien (STL) .lib