游子的博客
慈母手中线,游子身上衣, 临行密密缝,意恐迟迟归, 谁言寸草心,报得三春晖。 数据读取中,请稍候......
posts - 337,  comments - 546,  trackbacks - 0

使用更安全的C字符串操纵 (snprintf)
 
 
转载自:http://www.cublog.cn/opera/showart.php?blogid=17040&id=133235 
                      

作者: Builder.comWednesday, November 3 2004 11:13 AM 

声明在 和 中的标准 C 函数是由于缓冲区溢出所引发的缺陷(bug)和安全漏洞的丰富来源。
虽然推荐的解决方案是迁移到 C++ 的 和 库,但是并不是所有的程序都可以这样迁移。通过对很多流行的应用程序和操作系统的与安全相关的缺陷的研究发现,C 字符串函数的应用比我们想象的要多。
这个技巧将向你展示如何轻易地提高你的代码安全级别,即使代码中使用了标准 C 函数。
C99 标准 包括了一些明确检查了缓冲区大小的新函数,因此降低了出现溢出的机会。考虑以下有缺陷的例子:
void f(const char *p){char buf[11]={0};sprintf(buf,"%10s",p); //very dangerousprintf("%sn",buf);}      
不要让格式标记“%10s”误导你。如果 p 的长度大于10个字符,那么sprintf() 的写操作就会越过 buf 的边界,从而产生一个缓冲区溢出。 f("hello world!"); //12 characters + nul         
检测这类缺陷并不容易,因为它们只在 p 的长度大于10个字符的时候才会发生。
黑客通常利用这类脆弱的代码来入侵看上去安全的系统。要修正这一缺陷,可以使用函数snprintf() 代替函数sprintf(),函数snprintf() 的原型为:
intsnprintf(char* buf, size_t maxlen, const char* fmt, ...);
第二个参数定义能被写到 buf 中的字符的最大个数,不考虑格式标志以及源字符串的大小:    
snprintf(buf, 10, "%10s",p); //now safef("hello world!"); //string is chopped to "hello worl"
相似的,使用strncpy()、strncmp()、strncat()、strnicmp() 和 strnset() 相应地代替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 函数版本可以降低缓冲区溢出发生的可能性,也不要求对原始代码进行实质的变化。
                    
 
 

posted on 2006-11-05 19:08 游子 阅读(11111) 评论(5)  编辑 收藏 引用 所属分类: 软件

FeedBack:
# re: 使用更安全的C字符串操纵 (snprintf)----转载
2006-11-05 19:19 | 游子
但是我使用这个函数时,说没有定义。不知道这个函数的头文件是哪个?  回复  更多评论
  
# re: 使用更安全的C字符串操纵 (snprintf)----转载
2007-05-31 10:46 | learner
定义宏
#define snprintf _snprintf
搞定
@游子
  回复  更多评论
  
# re: 使用更安全的C字符串操纵 (snprintf)----转载
2007-12-07 11:00 | test
第二个参数定义能被写到 buf 中的字符的最大个数,不考虑格式标志以及源字符串的大小:
snprintf(buf, 10, "%10s",p); //now safef("hello world!"); //string is chopped to "hello worl"


这个有点问题吧,第二个参数定义能被写到 buf 中的字符的最大个数-1吧,因为包括结束符\0,所以结果应为:
snprintf(buf, 10, "%10s",p); //now safef("hello world!"); //string is chopped to "hello wor"
  回复  更多评论
  
# re: 使用更安全的C字符串操纵 (snprintf)----转载
2007-12-07 11:02 | test
不知你的%10s有什么用,我试了下好像没什么用啊  回复  更多评论
  
# re: 使用更安全的C字符串操纵 (snprintf)----转载
2008-07-23 17:15 | 洁尔阴洗面奶
snprintf(buf, 10, "%10s",p);

最多只有9个字符被写到buf中,'/0'会自动添加到字符串结束处  回复  更多评论
  
只有注册用户登录后才能发表评论。

欢迎大家扔鸡蛋!送鲜花!

博客可以收入过千吗?

<2006年5月>
日一二三四五六3012345678910111213
14151617181920212223242526272829303112345678910

常用链接

留言簿(8)

随笔分类(314)

随笔档案(337)

文章分类(7)

文章档案(10)

相册

收藏夹(1)

其它

友情链接

数字电视

生活、旅游

自己的链接

计算机

搜索

  •  

积分与排名

  • 积分 - 407734
  • 排名 - 9

最新评论

阅读排行榜

评论排行榜