• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

用更安全的C-string操控来减少溢出的机会

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 11次 | 进入软件测试论坛讨论

领测软件测试网

几十年以来,在<cstring>和<cstdio>里所声明的标准C函数已经由于缓冲区溢出的问题,成为错误和安全漏洞的沃土。尽管专家建议的解决办法是迁移到C++的<string>和<sstream>库,但是这并不总是可能的。 

最近一项关于在很多流行的应用程序和操作系统里同安全相关的错误的研究表明,C-string函数所使用的范围要比我们想像的大得多。下面的提示会告诉你可以如何轻易地提高代码的安全系数,即使它使用的是标准的C函数。

C99标准包括了新的函数,它们能够明确地检查缓冲区的大小,因此可以减少溢出的机会。想一想下面这个有问题的例子:

void f(const char *p)
{
 char buf[11]={0};
 sprintf(buf,"%10s",p); //very dangerous
 printf("%sn",buf);
}

不要让格式标记"%10s"误导了你。如果p碰巧大于10个字符,那么sprintf()所写的内容就会超出buf的边界,从而导致缓冲区的溢出:

f("hello world!"); //12 characters + nul

检查出这样的问题并不容易,因为它们只会在p大于10个字符的时候发生。黑客们常常会寻找这样容易出错的代码,以闯入看上去很安全的系统。要解决这个问题,就要把sprintf()替换成snprintf(),这样就有了下面的内容:

int
snprintf(char* buf, size_tmaxlen, const char* fmt, ...);

第二个自变量定义了写入到buf的字符的最大数量,而不管格式标记和源字符串的大小:

snprintf(buf, 10, "%10s",p); //now safe
f("hello world!"); //string is chopped to "hello worl0"

类似的,你要分别使用strncpy()、strncmp()、strncat()、strnicmp()和strnset(),而不要使用strcpy()、strcmp()、strcat()、stricmp()和strset()。例如:

const int LINE_SIZE=81;
char buf[LINE_SIZE]={0};
 // write up to 80 chars to buf:
strncpy(buf, dest, LINE_SIZE-1);
 // compare no more than 80 chars:
int equal= strncmp(buf, dest, LINE_SIZE-1);

使用限制了缓冲区的C函数能够减少缓冲区溢出的可能性,而不需要改动很多的原始代码。

本文作者:Danny Kalev是系统分析师兼软件工程师,在C++和面向对象的设计上14年的专业经验。

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网