安全注意事项:Microsoft Windows 控件

本主题提供有关 Windows 控件的安全注意事项的信息。 本主题中的信息并未提供你需要了解的关于安全问题的所有信息 - 此技术领域从本主题开始,主题中的内容仅供参考。

计算机之间的互连很常见;开发人员的主要关注点必须是应用程序安全性。 以下部分讨论了在对 Windows 控件编程时需要考虑的一些潜在安全问题。

以 null 结尾的控制消息

许多控件消息和宏都有字符串参数。 通常,这些消息不会验证输入字符串,特别是不会检查是否有终止 '\0'。 调用使用字符串作为参数的消息时,显式指定字符串以 null 结尾。

字符串使用

对 Windows 控件编程时,必须操控字符串。 几乎每个控件都需要插入文本。 例如,若要填充列表框,必须将字符串加载到控件中。 由于错误地使用字符串通常会导致缓冲区溢出,因此请采取预防措施来避免这种安全风险。

有关缓冲区溢出的详细信息,请参阅编写安全代码(作者:Michael Howard 和 David Leblanc,Microsoft Press,2002 年)和安全性 API 的最佳做法

输入验证

以下控制消息可能会显示安全问题。

如果从调用获取文本长度到显示或使用文本期间文本发生更改,则会出现缓冲区溢出情况。 为了避免这种情况,必须先验证字符串,然后再使用它。 此外,用于检索文本的消息 CB_GETLBTEXTTB_GETBUTTONTEXTTTM_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 Security Response Center(Microsoft 安全响应中心)

安全性 API 的最佳做法