本主题提供有关与Windows控件相关的安全注意事项的信息。 本主题中的信息不提供所有需要了解的安全问题 -- 将其用作此技术领域的起点和参考。
计算机之间的互连很常见;开发人员的主要考虑因素必须是应用程序安全性。 以下部分讨论了在编程Windows控件时要考虑的一些潜在安全问题。
Null 终止的控制消息
许多控件消息和宏都有字符串参数。 通常,这些消息不会验证输入字符串,特别是它们不会检查终止 '\0'。 调用使用字符串作为参数的消息时,显式指定字符串以 null 结尾。
字符串使用
对Windows控件进行编程时,必须操作字符串。 几乎每个控件都需要插入文本。 例如,若要填充列表框,必须将字符串加载到控件中。 由于使用字符串错误通常会导致缓冲区溢出,因此请采取预防措施来避免这种安全风险。
有关缓冲区溢出的详细信息,请参阅 Michael Howard 和 David LeBlanc 撰写的安全代码写安全代码,Microsoft Press,2002 年和 C1 的最佳做法。
输入验证
以下控制消息可能会显示安全问题。
- 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 参数值来获取缓冲区大小,然后再次调用消息以检索字符串。 |
相关主题
-
其他资源
-
安全 API 最佳做法