Funkcje zabezpieczeń w CRT

Wiele starych funkcji CRT ma nowsze, bezpieczniejsze wersje. Jeśli istnieje funkcja bezpieczna, starsza, mniej bezpieczna wersja jest oznaczona jako przestarzała, a nowa wersja ma _s sufiks ("bezpieczny").

W tym kontekście "przestarzałe" oznacza, że używanie funkcji nie jest zalecane. Nie oznacza to, że zaplanowano usunięcie funkcji z CRT.

Funkcje zabezpieczeń nie zapobiegają ani nie koryguje błędów zabezpieczeń. Zamiast tego przechwytują błędy, gdy wystąpią. Dodatkowo sprawdza warunki błędów. Jeśli wystąpi błąd, wywołują program obsługi błędów (zobacz Sprawdzanie poprawności parametrów).

Na przykład funkcja nie strcpy może określić, czy kopiowany ciąg jest zbyt duży dla buforu docelowego. Jego bezpieczny odpowiednik, strcpy_s, przyjmuje rozmiar buforu jako parametr. Dzięki temu może określić, czy nastąpi przepełnienie buforu. Jeśli używasz funkcji strcpy_s do kopiowania 11 znaków do 10-znakowego buforu, jest to błąd po Twojej stronie; strcpy_s nie możesz naprawić błędu. Może on jednak wykryć błąd i poinformować Cię przez wywołanie procedury obsługi nieprawidłowego parametru.

Eliminowanie ostrzeżeń dotyczących cofania pracy

Istnieje kilka sposobów wyeliminowania ostrzeżeń o cofaniu wersji starszych, mniej bezpiecznych funkcji. Najprostszym z nich jest po prostu zdefiniowanie lub _CRT_SECURE_NO_WARNINGS użycie ostrzeżenia pragma. Oba te ustawienia wyłączą ostrzeżenia o wyłączeniu, ale problemy z zabezpieczeniami, które spowodowały te ostrzeżenia, nadal istnieją. Lepiej pozostawić włączone ostrzeżenia dotyczące cofania obsługi i korzystać z nowych funkcji zabezpieczeń CRT.

W języku C++ najprostszym sposobem na to jest użycie przeciążeń bezpiecznego szablonu. W wielu przypadkach wyeliminuje to ostrzeżenia o wycofaniu, zastępując wywołania przestarzałych funkcji wywołaniami w celu zabezpieczenia wersji tych funkcji. Rozważmy na przykład to przestarzałe wywołanie funkcji strcpy:

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

Zdefiniowanie jako _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 eliminuje ostrzeżenie przez zmianę strcpystrcpy_swywołania na , co zapobiega przepełnień buforu. Aby uzyskać więcej informacji, zobacz Przeciążenia bezpiecznych szablonów.

W przypadku przestarzałych funkcji bez przeciążeń bezpiecznych szablonów zdecydowanie należy rozważyć ręczne zaktualizowanie kodu w celu używania bezpiecznych wersji.

Innym źródłem ostrzeżeń dotyczących cofania funkcjonalności, niezwiązanych z zabezpieczeniami, są funkcje POSIX. Zastąp nazwy funkcji POSIX swoimi standardowymi odpowiednikami (na przykład zmień dostęp do _access) lub wyłącz ostrzeżenia o cofaniu wersji POSIX przez zdefiniowanie _CRT_NONSTDC_NO_WARNINGS. Aby uzyskać więcej informacji, zobacz Zgodność.

Dodatkowe funkcje zabezpieczeń

Niektóre funkcje zabezpieczeń obejmują:

  • Parameter Validation. Bezpieczne funkcje i wiele z ich niezabezpieczonych odpowiedników weryfikują parametry. Walidacja może obejmować:

    • Sprawdzanie wartości NULL .
    • Sprawdzanie wyliczeniowych wartości pod
    • Sprawdzanie, czy wartości całkowite znajdują się w prawidłowych zakresach.
  • Aby uzyskać więcej informacji, zobacz Sprawdzanie poprawności parametrów.

  • Program obsługi nieprawidłowych parametrów jest również dostępny dla dewelopera. Gdy funkcja napotka nieprawidłowy parametr, zamiast potwierdzania i zamykania aplikacji, CRT umożliwia sprawdzanie tych problemów za pośrednictwem _set_invalid_parameter_handler , _set_thread_local_invalid_parameter_handler.

  • Sized Buffers. Należy przekazać rozmiar buforu do dowolnej funkcji zabezpieczonej, która zapisuje w buforze. Wersje zabezpieczone weryfikują, czy bufor jest wystarczająco duży przed zapisem w nim. Dzięki temu można uniknąć niebezpiecznych błędów przepełnienia buforu, które mogłyby umożliwić wykonanie złośliwego kodu. Te funkcje zwykle zwracają kod errno błędu i wywołują nieprawidłowy program obsługi parametrów, jeśli rozmiar buforu jest zbyt mały. Funkcje odczytu z buforów wejściowych, takie jak gets, mają bezpieczne wersje, które wymagają określenia maksymalnego rozmiaru.

  • Null termination. Niektóre funkcje, które pozostawiły potencjalnie niezakańowane ciągi, mają bezpieczne wersje, które zapewniają prawidłowe zakończenie ciągów o wartości null.

  • Enhanced error reporting. Bezpieczne funkcje zwracają kody błędów z większą informacją o błędzie niż była dostępna w przypadku istniejących funkcji. Funkcje bezpieczne i wiele errnoerrno z istniejących funkcji są teraz ustawiane i często zwracają również typ kodu, aby zapewnić lepsze raportowanie błędów.

  • Filesystem security. Bezpieczne interfejsy API we/wy plików obsługują bezpieczny dostęp do plików w przypadku domyślnym.

  • Windows security. Interfejsy API bezpiecznego procesu wymuszają zasady zabezpieczeń i zezwalają na określone adresy ACL.

  • Format string syntax checking. Wykryto nieprawidłowe ciągi, na przykład używając nieprawidłowych znaków pola typu w ciągach printf formatu.

Zobacz też

Walidacja parametru
Przeciążenia bezpiecznych szablonów
Pliki środowiska uruchomieniowego języka C (CRT) i standardowej biblioteki C++ (STL) .lib