WEB开发网
开发学院软件开发VC 修复缓冲区溢出问题 阅读

修复缓冲区溢出问题

 2009-03-07 20:02:33 来源:WEB开发网   
核心提示: 修复缓冲区溢出现在,我们继续讨论一些更实际的内容 - 如何在您的代码中删除和防止缓冲区溢出,修复缓冲区溢出问题(3),迁移到托管代码在 2002 年 2 月和 3 月,我们举办了 Microsoft Windows Security Push 活动,要求代码传递缓冲区的长度如果任何函数调用

修复缓冲区溢出

现在,我们继续讨论一些更实际的内容 - 如何在您的代码中删除和防止缓冲区溢出。 

迁移到托管代码

在 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);
}

上一页  1 2 3 4 5 6  下一页

Tags:修复 缓冲区 溢出

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接