Udostępnij za pośrednictwem


Funkcje zabezpieczeń w CRT

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

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

Funkcje bezpieczne nie uniemożliwiają ani nie naprawiają błędów zabezpieczeń. Zamiast tego przechwytują błędy, gdy wystąpią. Wykonują dodatkowe kontrole warunków błędów. Jeśli wystąpi błąd, wywołają procedurę obsługi błędów (zobacz Walidacja parametru).

Na przykład funkcja nie może określić, strcpy czy ciąg, który kopiuje, jest zbyt duży dla buforu docelowego. Jego bezpieczny odpowiednik , strcpy_sprzyjmuje rozmiar buforu jako parametr. W związku z tym może określić, czy wystąpi przepełninie buforu. Jeśli używasz strcpy_s polecenia , aby skopiować 11 znaków do buforu 10 znaków, jest to błąd w twojej części; strcpy_s nie można poprawić błędu. Może jednak wykryć błąd i poinformować Cię, wywołując nieprawidłową procedurę obsługi parametrów.

Eliminowanie ostrzeżeń o wycofaniu

Istnieje kilka sposobów wyeliminowania ostrzeżeń o wycofaniu dla starszych, mniej bezpiecznych funkcji. Najprostszym rozwiązaniem jest po prostu zdefiniowanie _CRT_SECURE_NO_WARNINGS lub użycie warning pragma. Albo spowoduje wyłączenie ostrzeżeń o wycofaniu, ale problemy z zabezpieczeniami, które spowodowały, że ostrzeżenia nadal istnieją. Lepiej pozostawić włączone ostrzeżenia o wycofaniu i skorzystać z nowych funkcji zabezpieczeń CRT.

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

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

Zdefiniowanie _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES jako 1 eliminuje ostrzeżenie przez zmianę strcpy wywołania na strcpy_s, co uniemożliwia przepełnienie buforu. Aby uzyskać więcej informacji, zobacz Bezpieczne przeciążenia szablonów.

W przypadku tych przestarzałych funkcji bez bezpiecznych przeciążeń szablonu należy zdecydowanie rozważyć ręczne zaktualizowanie kodu w celu korzystania z bezpiecznych wersji.

Innym źródłem ostrzeżeń o wycofaniu, niepowiązanym z zabezpieczeniami, jest funkcja POSIX. Zastąp nazwy funkcji POSIX standardowymi odpowiednikami (na przykład zmień access wartość na _access), lub wyłącz ostrzeżenia dotyczące wycofywania poSIX, definiując _CRT_NONSTDC_NO_WARNINGSwartość . Aby uzyskać więcej informacji, zobacz Zgodność.

Więcej funkcji zabezpieczeń

Oto niektóre funkcje zabezpieczeń:

  • Walidacja parametru

    Zabezpieczanie funkcji i wiele z ich niezabezpieczonych odpowiedników, weryfikowanie parametrów. Walidacja może obejmować:

    • NULL Sprawdzanie wartości.
    • Sprawdzanie wyliczonych wartości pod kątem ważności.
    • Sprawdzanie, czy wartości całkowite znajdują się w prawidłowych zakresach.

    Aby uzyskać więcej informacji, zobacz Walidacja parametrów.

    Procedura obsługi nieprawidłowych parametrów jest również dostępna dla dewelopera. Gdy funkcja napotka nieprawidłowy parametr, zamiast potwierdzania i zamykania aplikacji, narzędzie CRT umożliwia sprawdzenie tych problemów za pośrednictwem metody _set_invalid_parameter_handler lub _set_thread_local_invalid_parameter_handler.

  • o rozmiarze

    Należy przekazać rozmiar buforu do dowolnej funkcji zabezpieczonej, która zapisuje w buforze. Bezpieczne wersje sprawdzają, czy bufor jest wystarczająco duży przed zapisaniem go. Walidacja pomaga uniknąć niebezpiecznych błędów przekroczenia buforu, które mogą umożliwić wykonywanie złośliwego kodu. Te funkcje zwykle zwracają kod błędu i wywołują nieprawidłową procedurę errno obsługi parametrów, jeśli rozmiar buforu jest zbyt mały. Funkcje odczytujące z wejściowych, takie jak gets, mają bezpieczne wersje, które wymagają określenia maksymalnego rozmiaru.

  • Kończenie zakończenia wartości null

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

  • Ulepszone raportowanie błędów

    Bezpieczne funkcje zwracają kody błędów z większą ilością informacji o błędach niż było dostępne w istniejących funkcjach. Bezpieczne funkcje i wiele wstępnie istniejących funkcji są teraz ustawiane errno i często zwracają errno typ kodu, aby zapewnić lepsze raportowanie błędów.

  • Zabezpieczenia systemu plików

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

  • Zabezpieczenia systemu Windows

    Bezpieczne interfejsy API procesów wymuszają zasady zabezpieczeń i zezwalają na określenie list ACL.

  • Sprawdzanie składni ciągu formatu

    Wykryto nieprawidłowe ciągi, na przykład w przypadku używania nieprawidłowych znaków pól typu w printf ciągach formatu.

Zobacz też

Walidacja parametru
Przeciążenia bezpiecznego szablonu
Pliki C runtime (CRT) i C++ Standard Library (STL) .lib