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 hat das _s Suffix ("secure") .

In diesem Zusammenhang bedeutet "veraltet", dass die Verwendung der Funktion nicht empfohlen wird. Es bedeutet nicht, dass die Funktion aus dem CRT entfernt wird.

Die sicheren Funktionen verhindern oder beheben keine Sicherheitsfehler. Stattdessen erfassen sie Fehler, wenn sie auftreten. Sie führen zusätzliche Überprüfungen auf Fehlerbedingungen durch. Wenn ein Fehler auftritt, rufen sie einen Fehlerhandler auf (siehe Parameterüberprüfung).

Die Funktion kann z. B. nicht feststellen, strcpy ob die kopierte Zeichenfolge zu groß für den Zielpuffer ist. Das sichere Gegenstück strcpy_snimmt die Größe des Puffers als Parameter an. Sie kann also ermitteln, ob ein Pufferüberlauf auftritt. Wenn Sie strcpy_s 11 Zeichen in einen 10-Zeichen-Puffer kopieren, ist dies ein Fehler auf Ihrem Teil. strcpy_s Der Fehler kann nicht korrigiert werden. Der Fehler kann jedoch erkannt und Sie durch Aufrufen des ungültigen Parameterhandlers informiert werden.

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 zu definieren _CRT_SECURE_NO_WARNINGS oder zu verwenden. Entweder werden Veraltete Warnungen deaktiviert, 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, die Veraltetkeitswarnungen zu beseitigen, darin, Sichere Vorlagenüberladungen zu verwenden. Die Überladungen beseitigen in vielen Fällen Veraltetkeitswarnungen. 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 "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 (z. B. Ändern in access_access), oder deaktivieren Sie POSIX-bezogene Deprecation-Warnungen durch Definieren _CRT_NONSTDC_NO_WARNINGS. Weitere Informationen finden Sie unter Kompatibilität.

Weitere Sicherheitsfeatures

Einige der Sicherheitsfeatures umfassen:

  • Parameterüberprüfung

    Sichere Funktionen und viele ihrer unsicheren Entsprechungen ü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 Parameterüberprüfung.

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

  • 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 er in den Puffer geschrieben wird. Die Überprüfung trägt dazu bei, gefährliche Pufferüberlauffehler zu vermeiden, die das Ausführen von bösartigem Code ermöglichen könnten. Diese Funktionen geben in der Regel einen errno Fehlercode zurück und rufen den ungültigen Parameterhandler 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-Beendigung

    Einige Funktionen, die potenziell nicht beendete Zeichenfolgen hinterlassen haben, 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 errno Codetyp zurück, um eine bessere Fehlerberichterstattung bereitzustellen.

  • 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.

  • Formatieren der Zeichenfolgensyntaxüberprüfung

    Ungültige Zeichenfolgen werden erkannt, z. B. wenn Sie falsche Typfeldzeichen in printf Formatzeichenfolgen verwenden.

Siehe auch

Parameterüberprüfung
Sichere Vorlagenüberladungen
C-Runtime-Dateien (CRT) und C++ Standard Library (STL) .lib