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_s
przyjmuje 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_WARNINGS
wartość . 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 jakgets
, 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