Zagadnienia dotyczące zabezpieczeń: Mechanizmy kontroli systemu Microsoft Windows
Ten temat zawiera informacje o zagadnieniach dotyczących zabezpieczeń związanych z kontrolkami systemu Windows. Informacje przedstawione w tym temacie nie zawierają wszystkich potrzebnych informacji o problemach z zabezpieczeniami — użyj ich jako punktu wyjścia i odwołania do tego obszaru technologii.
Łączność między komputerami jest powszechna; głównym problemem dewelopera musi być bezpieczeństwo aplikacji. W poniższych sekcjach omówiono niektóre potencjalne problemy z zabezpieczeniami, które należy wziąć pod uwagę podczas programowania kontrolek systemu Windows.
- komunikatów sterujących zakończonych wartościami null
- Używanie ciągu
- sprawdzanie poprawności danych wejściowych
- użycie hasła
- alerty zabezpieczeń
- Tematy pokrewne
Komunikaty sterujące zakończone wartością null
Wiele komunikatów sterujących i makr ma parametry ciągu. Często te komunikaty nie weryfikują ciągów wejściowych, w szczególności nie sprawdzają zakończenia '\0'
. W przypadku wywoływania komunikatu, który używa ciągu jako parametru, jawnie określ, że ciąg jest zakończony wartością null.
Użycie ciągu
Podczas programowania kontrolek systemu Windows konieczne jest manipulowanie ciągami. Prawie każda kontrolka wymaga wstawienia tekstu. Aby na przykład wypełnić pole listy, musisz załadować ciągi do kontrolki. Ponieważ używanie ciągów niepoprawnie często powoduje przekroczenie buforu, należy podjąć środki ostrożności, aby uniknąć tego ryzyka bezpieczeństwa.
Aby uzyskać więcej informacji na temat przepełnień buforu, zobacz Writing Secure Code by Michael Howard and David LeBlanc, Microsoft Press, 2002 i Best Practices for the Security APIs.
Walidacja danych wejściowych
Następujące komunikaty sterujące mogą przedstawiać problemy z zabezpieczeniami.
- CB_GETLBTEXT
- LVM_GETISEARCHSTRING
- SB_GETTEXT
- SB_GETTIPTEXT
- TB_GETBUTTONTEXT
- TTM_GETTEXT
- TVM_GETISEARCHSTRING
Jeśli tekst zmieni się między wywołaniem, aby uzyskać długość tekstu i czas wyświetlania lub użycia tekstu, może wystąpić przepełnienie buforu. Aby tego uniknąć, należy zweryfikować ciąg przed jego użyciem. Ponadto komunikaty pobierające tekst, CB_GETLBTEXT, TB_GETBUTTONTEXTi TTM_GETTEXT, nie mają parametru rozmiaru buforu, który przedstawia potencjalny przeładowanie buforu.
W przypadku używania CB_GETLBTEXT lub SB_GETTEXTnależy najpierw wywołać CB_GETLBTEXTLEN lub SB_GETTEXTLENGTH, aby uzyskać rozmiar buforu. Niektóre z tych komunikatów, TB_GETBUTTONTEXT, LVM_GETISEARCHSTRINGi TVM_GETISEARCHSTRING, można wywołać za pomocą wartości parametru o wartości NULL, aby uzyskać długość ciągu przed wywołaniem komunikatu w celu pobrania ciągu.
Komunikat, który należy zwrócić szczególną uwagę, to pasek stanu SB_GETTIPTEXT komunikat. Ten komunikat nie umożliwia wykonywania zapytań dotyczących długości ciągu, który ma zostać pobrany.
Użycie hasła
Jeśli używasz kontrolek edycji chronionych hasłem (ES_PASSWORD stylu), bufor zawierający pobrany tekst musi być ustawiony na zero tak szybko, jak to możliwe, aby uniknąć ujawnienia hasła użytkownika w pamięci.
Alerty zabezpieczeń
W poniższej tabeli wymieniono funkcje, które w przypadku nieprawidłowego użycia mogą naruszyć bezpieczeństwo aplikacji. Komunikaty wymienione w tym miejscu nie zawierają parametru, który określa rozmiar buforu.
Cecha | Łagodzenia |
---|---|
DlgDirListComboBox | Upewnij się, że bufor używany przez funkcję może być zapisywany i jest zakończony wartością null. |
CB_GETLBTEXT | Wywołaj CB_GETLBTEXTLEN, aby uzyskać rozmiar buforu, a następnie wywołaj CB_GETLBTEXT, aby pobrać ciąg. |
LVM_GETISEARCHSTRING | Wywołaj komunikat z wartością NULL parametru, aby uzyskać rozmiar buforu, a następnie wywołaj komunikat po raz drugi, aby pobrać ciąg. |
SB_GETTEXT | Wywołaj SB_GETTEXTLENGTH, aby uzyskać rozmiar buforu, a następnie wywołaj SB_GETTEXT, aby pobrać ciąg. |
TB_GETBUTTONTEXT | Wywołaj komunikat z wartością NULL parametru, aby uzyskać rozmiar buforu, a następnie wywołaj komunikat po raz drugi, aby pobrać ciąg. |
TTM_GETTEXT | Ten komunikat nie zapewnia sposobu, w jaki można znać lub określić rozmiar buforu. |
TVM_GETISEARCHSTRING | Wywołaj komunikat, przekazując wartość parametru NULL, aby uzyskać rozmiar buforu, a następnie wywołaj komunikat po raz drugi, aby pobrać ciąg. |
Tematy pokrewne
-
innych zasobów
-
najlepsze rozwiązania dotyczące interfejsów API zabezpieczeń