安全注意事项:Microsoft Windows 控件
本主题提供有关 Windows 控件的安全注意事项的信息。 本主题中的信息并未提供你需要了解的关于安全问题的所有信息 - 此技术领域从本主题开始,主题中的内容仅供参考。
计算机之间的互连很常见;开发人员的主要关注点必须是应用程序安全性。 以下部分讨论了在对 Windows 控件编程时需要考虑的一些潜在安全问题。
以 null 结尾的控制消息
许多控件消息和宏都有字符串参数。 通常,这些消息不会验证输入字符串,特别是不会检查是否有终止 '\0'
。 调用使用字符串作为参数的消息时,显式指定字符串以 null 结尾。
字符串使用
对 Windows 控件编程时,必须操控字符串。 几乎每个控件都需要插入文本。 例如,若要填充列表框,必须将字符串加载到控件中。 由于错误地使用字符串通常会导致缓冲区溢出,因此请采取预防措施来避免这种安全风险。
有关缓冲区溢出的详细信息,请参阅编写安全代码(作者:Michael Howard 和 David Leblanc,Microsoft Press,2002 年)和安全性 API 的最佳做法。
输入验证
以下控制消息可能会显示安全问题。
- CB_GETLBTEXT
- LVM_GETISEARCHSTRING
- SB_GETTEXT
- SB_GETTIPTEXT
- TB_GETBUTTONTEXT
- TTM_GETTEXT
- TVM_GETISEARCHSTRING
如果从调用获取文本长度到显示或使用文本期间文本发生更改,则会出现缓冲区溢出情况。 为了避免这种情况,必须先验证字符串,然后再使用它。 此外,用于检索文本的消息 CB_GETLBTEXT、TB_GETBUTTONTEXT 和 TTM_GETTEXT 没有表示缓冲区溢出可能性的缓冲区大小参数。
使用 CB_GETLBTEXT 或 SB_GETTEXT 时,应首先调用 CB_GETLBTEXTLEN 或 SB_GETTEXTLENGTH 以获取缓冲区大小。 其中一些消息(TB_GETBUTTONTEXT、LVM_GETISEARCHSTRING 和 TVM_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 Security Response Center(Microsoft 安全响应中心)