用更安全的C字符串操纵
来源:互联网 发布:下载magnet的软件 编辑:程序博客网 时间:2024/04/30 21:34
使
作者: Builder.com
Wednesday, 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 dangerous
printf("%sn",buf);
}
不要让格式标记“%10s”误导你。如果 p 的长度大于10个字符,那么sprintf() 的写操作就会越过 buf 的边界,从而产生一个缓冲区溢出。
f("hello world!"); //12 characters + nul
检测这类缺陷并不容易,因为它们只在 p 的长度大于10个字符的时候才会发生。黑客通常利用这类脆弱的代码来入侵看上去安全的系统。要修正这一缺陷,可以使用函数snprintf() 代替函数sprintf(),函数snprintf() 的原型为:
int
snprintf(char* buf, size_t maxlen, const char* fmt, ...);
第二个参数定义能被写到 buf 中的字符的最大个数,不考虑格式标志以及源字符串的大小:
snprintf(buf, 10, "%10s",p); //now safe
f("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 函数版本可以降低缓冲区溢出发生的可能性,也不要求对原始代码进行实质的变化。
- 用更安全的C字符串操纵
- 使用更安全的C字符串操纵 (snprintf)
- 更安全的C语言字符串处理函数
- Strsafe.h:更安全的C语言字符串处理函数
- 操纵 C 风格字符串的标准库函数
- vs2010 c++更安全的字符串及文件操作
- 操纵C 风格字符串标准库函数
- 更安全的HTTPS
- 更安全的MmIsAddressValid
- 用C++Builder操纵Excel
- 《C和指针》读书笔记--标准输入输出函数和基础的字符串操纵函数
- 用于操纵字符串的的String类
- 更简单、更安全的查询方法
- C语言的字符串处理函数(更)
- 更安全的压裂
- 改用更安全的HTTPS
- 多线程程序中线程安全的操纵可视化控件
- 采用.NET框架(C#)做的网盘存储更安全 技术决定
- Forget it@
- 为什么?
- 内存分配
- 数据结构复习篇:栈
- 多进程和多线程的区别
- 用更安全的C字符串操纵
- 十一放假
- 国庆[by Mr.No]
- 计算机图形学算法演示程序(c#开源)
- 有朋友叫我去做影评。
- 这几天心情不好
- About movie..
- 转了一圈,终于还是回到了这里
- 给XX公司网站做的一个模块。很丑陋。