修复缓冲区溢出问题
2009-03-07 20:02:33 来源:WEB开发网修复缓冲区溢出
现在,我们继续讨论一些更实际的内容 - 如何在您的代码中删除和防止缓冲区溢出。
迁移到托管代码
在 2002 年 2 月和 3 月,我们举办了 Microsoft Windows Security Push 活动。在此期间,我的工作组对 8,500 多位人员在设计、编写、测试和记录安全功能方面进行了培训。我们为所有设计人员提出的一个建议就是,制定计划,将相应的应用程序和工具从本机 Win32 C++ 代码迁移到托管代码。这样做有多种原因,主要是有助于减少缓冲区溢出。在托管代码中,很难创建出包含缓冲区溢出的代码,因为所编写的代码不能直接访问指针、计算机寄存器或内存。您应当考虑,或者至少要计划将某些应用程序和工具迁移到托管代码中。例如,管理工具就是一个很好的迁移对象。当然,我们也要现实一些,因为不可能在一个晚上将所有的应用程序从 C++ 迁移到 C# 或其他托管语言中。
遵循以下重要规则
当编写 C 和 C++ 代码时,应注意如何管理来自用户的数据。如果某个函数具有来自不可靠源的缓冲区,请遵循以下规则:
要求代码传递缓冲区的长度。
探测内存。
采取防范措施。
现在我们来仔细看看以上每种情况。
要求代码传递缓冲区的长度
如果任何函数调用具有类似特征,将出现一个错误:
void Function(char *szName) {
char szBuff[MAX_NAME];
// 复制并使用 szName
strcpy(szBuff,szName);
}
此代码的问题在于函数不能判断 szName 的长度,这意味着将不能安全地复制数据。函数应知道 szName 的大小:
void Function(char *szName, DWORD cbName) {
char szBuff[MAX_NAME];
// 复制并使用 szName
if (cbName < MAX_NAME)
strncpy(szBuff,szName,MAX_NAME-1);
}
更多精彩
赞助商链接