安全性考慮:Microsoft Windows 控件

本主題提供與 Windows 控制件相關的安全性考慮相關信息。 本主題中的資訊不會提供您對於安全性問題所需的所有資訊,請將其作為此技術領域的起點和參考。

計算機之間的互連性很常見;開發人員的主要考慮必須是應用程式安全性。 下列各節將討論程序設計 Windows 控制件時需要考慮的一些潛在安全性問題。

Null 終止的控制訊息

許多控件訊息和宏都有字串參數。 這些訊息通常不會驗證輸入字串,特別是不會檢查終止 '\0'的 。 當您呼叫使用字串做為參數的訊息時,請明確指定字元串為 Null 終止。

字串使用

當您對 Windows 控制件進行程式設計時,必須操作字串。 幾乎每個控件都需要插入文字。 例如,若要填入清單框,您必須將字串載入控制項。 因為不正確地使用字串通常會造成緩衝區滿溢,因此請採取預防措施,以避免發生此安全性風險。

如需緩衝區滿溢的詳細資訊,請參閱由 Michael Howard 和 David LeBlanc 撰寫安全程式代碼、Microsoft Press、2002 和 安全性 API 的最佳作法。

輸入驗證

下列控制訊息可能會顯示安全性問題。

如果呼叫之間的文字變更以取得文字長度,以及顯示或使用文字的時間,可能會發生緩衝區滿溢。 若要避免這種情況,您必須先驗證字串,才能使用它。 此外,擷取文字、CB_GETLBTEXT、TB_GETBUTTONTEXT和TTM_GETTEXT的訊息,沒有緩衝區大小參數,可能會造成緩衝區滿溢。

當您使用CB_GETLBTEXTSB_GETTEXT時,應該先呼叫CB_GETLBTEXTLENSB_GETTEXTLENGTH,以取得緩衝區大小。 其中一些訊息,TB_GETBUTTONTEXTLVM_GETISEARCHSTRINGTVM_GETISEARCHSTRING,可以使用NULL 參數值呼叫,以取得字串的長度,然後再叫用訊息來擷取字元串。

您應該特別注意的訊息是狀態列 SB_GETTIPTEXT 訊息。 此訊息無法查詢要擷取之字串的長度。

密碼使用

如果您使用受密碼保護的編輯控件(ES_PASSWORD 樣式),則包含所擷取文字的緩衝區必須儘快設定為零,以避免在記憶體中公開用戶的密碼。

安全性警示

下表列出不正確地使用的功能可能會危害應用程式的安全性。 此處所列的訊息不提供指定緩衝區大小的參數。

功能 風險降低
DlgDirListComboBox 請確定函式所使用的緩衝區可以寫入 ,並且以 Null 終止。
CB_GETLBTEXT 呼叫 CB_GETLBTEXTLEN 以取得緩衝區大小,然後呼叫 CB_GETLBTEXT 來擷取字串。
LVM_GETISEARCHSTRING 使用 NULL 參數值呼叫訊息以取得緩衝區大小,然後第二次呼叫訊息以擷取字串。
SB_GETTEXT 呼叫 SB_GETTEXTLENGTH 以取得緩衝區大小,然後呼叫 SB_GETTEXT 來擷取字串。
TB_GETBUTTONTEXT 使用 NULL 參數值呼叫訊息以取得緩衝區大小,然後第二次呼叫訊息以擷取字串。
TTM_GETTEXT 此訊息不會讓您知道或指定緩衝區的大小。
TVM_GETISEARCHSTRING 傳遞 NULL 參數值以取得緩衝區大小,然後第二次呼叫訊息來擷取字串,以呼叫訊息。

 

其他資源

Microsoft 安全性

安全性

Microsoft 安全性回應中心

安全性 API 的最佳做法