Dela via


Säkerhetsfunktioner i CRT

Många gamla CRT-funktioner har nyare och säkrare versioner. Om det finns en säker funktion markeras den äldre, mindre säkra versionen som inaktuell. Den nya versionen har suffixet _s ("secure").

I det här sammanhanget innebär "inaktuell" att användningen av funktionen inte rekommenderas. Det betyder inte att funktionen tas bort från CRT.

De säkra funktionerna förhindrar eller korrigerar inte säkerhetsfel. I stället fångar de upp fel när de inträffar. De gör extra kontroller för feltillstånd. Om det finns ett fel anropar de en felhanterare (se Parameterverifiering).

Funktionen kan till exempel strcpy inte avgöra om strängen den kopierar är för stor för målbufferten. Dess säkra motsvarighet, strcpy_s, tar storleken på bufferten som en parameter. Därför kan den avgöra om en buffertöverskridning kommer att inträffa. Om du använder strcpy_s för att kopiera 11 tecken till en buffert på 10 tecken är det ett fel från din sida, strcpy_s det kan inte korrigera ditt misstag. Men det kan identifiera ditt fel och informera dig genom att anropa den ogiltiga parameterhanteraren.

Eliminera avskrivningsvarningar

Det finns flera sätt att eliminera utfasningsvarningar för äldre, mindre säkra funktioner. Det enklaste är helt enkelt att definiera _CRT_SECURE_NO_WARNINGS eller använda warning pragma. Antingen inaktiveras utfasningsvarningar, men de säkerhetsproblem som orsakade varningarna finns fortfarande. Det är bättre att låta utfasningsvarningar vara aktiverade och dra nytta av de nya CRT-säkerhetsfunktionerna.

I C++ är det enklaste sättet att eliminera utfasningsvarningarna att använda överlagringar av säkra mallar. Överbelastningarna eliminerar utfasningsvarningar i många fall. De ersätter anrop till inaktuella funktioner med anrop till säkra versioner av funktionerna. För exempel, tänk på detta föråldrade anrop till strcpy:

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

Att _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES definiera som 1 eliminerar varningen genom att ändra anropet strcpy till strcpy_s, vilket förhindrar buffertöverskridanden. För mer information, se Secure template overloads.

För de inaktuella funktionerna utan överlagring av säkra mallar bör du definitivt överväga att uppdatera koden manuellt för att använda de säkra versionerna.

En annan källa till utfasningsvarningar som inte är relaterade till säkerhet är POSIX-funktionerna. Ersätt POSIX-funktionsnamn med deras standardekvivalenter (till exempel ändra access till _access) eller inaktivera POSIX-relaterade utfasningsvarningar genom att _CRT_NONSTDC_NO_WARNINGSdefiniera . Mer information finns i Kompatibilitet.

Fler säkerhetsfunktioner

Några av säkerhetsfunktionerna är:

  • Parameterverifiering

    Säkra funktioner, och många av deras osäkra motsvarigheter, validerar parametrar. Validering kan omfatta:

    • Kontrollerar NULL värden.
    • Kontrollera uppräknade värden för giltighet.
    • Kontrollera att integralvärdena finns i giltiga intervall.

    Mer information finns i Parameterverifiering.

    En hanterare för ogiltiga parametrar är också tillgänglig för utvecklaren. När en funktion stöter på en ogiltig parameter, i stället för att hävda och avsluta programmet, kan du med CRT kontrollera dessa problem via _set_invalid_parameter_handler eller _set_thread_local_invalid_parameter_handler.

  • Storleksbuffertar

    Du måste skicka buffertstorleken till alla säkra funktioner som skriver till en buffert. De säkra versionerna verifierar att bufferten är tillräckligt stor innan den skrivs till den. Valideringen hjälper till att undvika farliga buffertöverskridningsfel som kan tillåta skadlig kod att köras. Dessa funktioner returnerar vanligtvis en errno felkod och anropar den ogiltiga parameterhanteraren om buffertens storlek är för liten. Funktioner som läser från indatabuffertar, till exempel gets, har säkra versioner som kräver att du anger en maximal storlek.

    Felsökningsversionerna av vissa säkerhetsförbättrade CRT-funktioner fyller bufferten som skickas till dem med ett specialtecken (0xFE). Denna utfyllnadstecken hjälper till att hitta fall där fel storlek har skickats till funktionen. Tyvärr minskar det också prestanda. För att förbättra prestandan använder du _CrtSetDebugFillThreshold för att inaktivera buffertfyllning. Mer information och en lista över funktioner som har det här beteendet finns i _CrtSetDebugFillThreshold.

  • Null-avslutning

    Vissa funktioner som lämnade potentiellt icke-avslutade strängar har säkra versioner, vilket säkerställer att strängarna är korrekt null-terminerade.

  • Förbättrad felrapportering

    De säkra funktionerna returnerar felkoder med mer felinformation än vad som var tillgängligt med de befintliga funktionerna. De säkra funktionerna och många av de befintliga funktionerna har nu angetts errno och returnerar ofta även en errno kodtyp för att ge bättre felrapportering.

  • Filsystemsäkerhet

    I/O-API:er för säker fil stöder säker filåtkomst i standardfallet.

  • Windows-säkerhet

    API:er för säker process framtvingar säkerhetsprinciper och tillåter att ACL:er anges.

  • Syntaxkontroll av formateringssträng

    Ogiltiga strängar identifieras, till exempel när du använder felaktiga typfälttecken i printf formatsträngar.

Se även

Parameterverifiering
Skydda mallöverbelastningar
.lib