Sdílet prostřednictvím


Funkce zabezpečení v CRT

Mnoho starých funkcí CRT má novější, bezpečnější verze. Pokud existuje zabezpečená funkce, starší, méně zabezpečená verze se označí jako zastaralá. Nová verze má příponu _s ("secure").

V tomto kontextu "zastaralé" znamená, že použití funkce se nedoporučuje. Neznamená to, že funkce bude odebrána z CRT.

Zabezpečené funkce nezabrání nebo opraví chyby zabezpečení. Místo toho zachytí chyby, když dojde k jejich výskytu. Provádějí dodatečné kontroly chybových podmínek. Pokud dojde k chybě, vyvolají obslužnou rutinu chyby (viz Ověřování parametrů).

Funkce strcpy například nemůže zjistit, jestli je řetězec, který kopíruje, příliš velký pro cílovou vyrovnávací paměť. Jeho zabezpečený protějšek strcpy_s přijímá velikost vyrovnávací paměti jako parametr. Může tedy určit, jestli dojde k přetečení vyrovnávací paměti. Pokud použijete strcpy_s ke zkopírování 11 znaků do vyrovnávací paměti o velikosti 10 znaků, je to vaše chyba; strcpy_s nemůže opravit vaši chybu. Ale může zjistit vaši chybu a informovat vás vyvoláním obslužné rutiny pro neplatné parametry.

Odstranění upozornění na zastarání

Existuje několik způsobů, jak eliminovat upozornění na vyřazení starších, méně zabezpečených funkcí. Nejjednodušší je jednoduše definovat _CRT_SECURE_NO_WARNINGS nebo použít direktivu warning pragma. Zakáže upozornění o vyřazení, ale problémy se zabezpečením, které způsobily tato upozornění, stále přetrvávají. Je lepší ponechat upozornění na zastaralé funkce povolená a využívat nové bezpečnostní prvky CRT.

V jazyce C++ je nejjednodušším způsobem, jak eliminovat upozornění na zastaralost, použít zabezpečená přetížení šablon. Přetížení odstraňují upozornění na zastaralost v mnoha případech. Nahrazují volání zastaralých funkcí voláními zabezpečených verzí funkcí. Zvažte například toto zastaralé volání strcpy:

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

Definování _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES jako 1 eliminuje upozornění změnou strcpy volání na strcpy_s, což brání přetečení vyrovnávací paměti. Další informace naleznete v tématu Přetížení šablon zabezpečení.

U zastaralých funkcí bez přetížení zabezpečených šablon byste měli určitě zvážit ruční aktualizaci kódu tak, aby používal zabezpečené verze.

Dalším zdrojem upozornění na zastaralost, nesouvisející se zabezpečením, jsou funkce systému POSIX. Názvy funkcí POSIX nahraďte jejich standardními ekvivalenty (například změnou access na _access) nebo zakažte upozornění vyřazení související s POSIX definováním _CRT_NONSTDC_NO_WARNINGS. Další informace naleznete v tématu Kompatibilita.

Další funkce zabezpečení

Mezi funkce zabezpečení patří:

  • Ověřování parametrů

    Zabezpečené funkce a řada jejich nezabezpečených protějšků ověřuje parametry. Ověření může zahrnovat:

    • Kontrola hodnot NULL.
    • Kontrola platnosti výčtových hodnot
    • Kontrola, že celočíselné hodnoty jsou v platných rozsazích.

    Další informace najdete v tématu Ověření parametru.

    Obslužná rutina pro neplatné parametry je také přístupná pro vývojáře. Když funkce narazí na neplatný parametr, namísto uplatnění a ukončení aplikace, CRT umožňuje zkontrolovat tyto problémy prostřednictvím _set_invalid_parameter_handler nebo _set_thread_local_invalid_parameter_handler.

  • Vyrovnávací paměti velikosti

    Velikost vyrovnávací paměti musíte předat jakékoli zabezpečené funkci, která zapisuje do vyrovnávací paměti. Před zápisem do vyrovnávací paměti zabezpečené verze ověřují, že vyrovnávací paměť je dostatečně velká. Ověřování pomáhá vyhnout se nebezpečným chybám přetečení vyrovnávací paměti, které by mohly umožnit spuštění škodlivého kódu. Tyto funkce obvykle vrací kód chyby a vyvolají obslužnou rutinu pro neplatný parametr, pokud je velikost vyrovnávací paměti příliš malá. Funkce, které čtou ze vstupních vyrovnávacích pamětí, například getsmají zabezpečené verze, které vyžadují, abyste zadali maximální velikost.

    Ladicí verze některých funkcí CRT s rozšířeným zabezpečením vyplní vyrovnávací paměť předanou jim speciálním znakem (0xFE). Tento vyplňovací znak pomáhá najít případy, kdy byla funkci předána nesprávná velikost. Bohužel to také snižuje výkon. Chcete-li zvýšit výkon, použijte _CrtSetDebugFillThreshold k zakázání plnění vyrovnávací paměti. Další informace a seznam funkcí, které toto chování mají, naleznete v tématu _CrtSetDebugFillThreshold.

  • Ukončení nulovým znakem

    Některé funkce, které mohly zanechávat řetězce neukončené, mají zabezpečené verze, které zajišťují, že řetězce jsou správně ukončeny nulovým znakem.

  • Vylepšené zasílání zpráv o chybách

    Zabezpečené funkce vrací kódy chyb s více informacemi o chybách, než byly k dispozici u existujících funkcí. Zabezpečené funkce a řada existujících funkcí teď nastavují errno a často vrací také typ kódu errno, aby poskytovaly lepší hlášení chyb.

  • Zabezpečení systému souborů

    Zabezpečená rozhraní API pro vstupně-výstupní operace souborů podporují zabezpečený přístup k souborům ve výchozím případě.

  • Zabezpečení Windows

    Zabezpečená rozhraní API procesu vynucují zásady zabezpečení a umožňují zadat seznamy ACL.

  • Kontrola syntaxe řetězce formátu

    Neplatné řetězce jsou detekovány například při použití nesprávných znaků pole typu ve formátových řetězcích printf.

Viz také

Ověření parametru
Přetížení zabezpečených šablon
Soubory C runtime (CRT) a standardní knihovny C++ (STL) .lib