使用更安全的C字符串操纵
作者: 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 函数版本可以降低缓冲区溢出发生的可能性,也不要求对原始代码进行实质的

http://linux.chinaunix.net/techdoc/net/2006/12/25/946682.shtml

转载于:https://www.cnblogs.com/kungfupanda/archive/2012/12/19/2825221.html

使用更安全的C字符串操纵相关推荐

  1. 蓝桥杯真题 19省2-年号字串 小明用字母 A 对应数字 1, B 对应 2,以此类推,用 Z 对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27, AB

    问题描述 小明用字母 A 对应数字 1, B 对应 2,以此类推,用 Z 对应 26.对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27, AB 对应 28, AZ 对应 ...

  2. Elasticsearch:使用新的 wildcard 字段更快地在字符串中查找字符串 - 7.9 新功能

    在 Elasticsearch 7.9 中,我们将引入一种新的 "wildcard" 字段类型,该字段类型经过优化,可在字符串值中快速查找模式.这种新的字段类型采用了一种全新的方式 ...

  3. string.h 或 cstring 头文件包含的字符串操纵函数查询

    参考网站:http://www.cplusplus.com/reference/cstring/ 头文件函数问题尽量去官网,或权威网站查找信息,知识全面

  4. strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数

    strlcpy 和 strlcat-- 一致的.安全的字符串拷贝和串接函数 Todd C. Miller University of Colorado, Boulder Theo de Raadt O ...

  5. 字符、字符串和文本的处理之String类型

    .Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...

  6. c 字符串数组_C语言探索之旅 | 第二部分第四课:字符串

    内容简介 前言 字符类型 显示字符 字符串其实就是字符的数组 字符串的创建和初始化 从 scanf 函数取得一个字符串 操纵字符串的一些常用函数 总结 第二部分第五课预告 1. 前言 上一课 C语言探 ...

  7. 万门69节入门python_Python入门六:字符串

    1.字符串格式化 1)字符串 使用" "或' '包裹的任意文本. 打印多行文字的方法:使用一对三引号''' '''来包裹多行字符串: 使用换行符\n,其后方的内容将另起一行显示. ...

  8. java append concat_关于java:+ =比concat更有效吗?

    本问题已经有最佳答案,请猛点这里访问. 我一直在阅读我的团队中其他开发人员生成的代码,他们似乎更喜欢使用+=进行字符串连接,而我更喜欢使用.concat(),因为它更容易阅读. 我正在尝试准备一个论据 ...

  9. python中字符串格式化

    目的:使用字符串的格式化可以更方便的写字符串,且便于修改. 环境:ubuntu 16.04  python 3.5.2 情景:在表达一个字符串时可能会需要把变量也加进去,用加号感觉比较麻烦,可以用字符 ...

最新文章

  1. C 语言编程 — 运算符
  2. postman api
  3. OpenCV-文档扫描OCR识别-04
  4. java JFrame 设置背景颜色无效的理解
  5. 池化层在全连接层之间吗,了解最大池化层之后的全连接层的尺寸
  6. 获取文件的MIME类型
  7. getopt在Python中的使用
  8. cad文字插件_超好用的4个CAD应用程序,让你提升工作幸福感,裂墙推荐
  9. SqlServer中decimal(numeric )、float 和 real 数据类型的区别[转]
  10. c语言视频教程全集(c语言视频教程 谭浩强)
  11. 计算机维修的税收编码,维修服务在税收分类编码是什么?
  12. Vue+elementUI导出xlsl表格,支持复杂表头,自动合拼单元格。xlsx+file-saver插件
  13. Nginx反向代理有什么用?
  14. 代码中的Status和State语义
  15. 时间漩涡的世界 (一)
  16. itunes下载的app在哪里及如何查看iTunes下载的软件
  17. VB6 MsgBox 函数
  18. android学习笔记之磁场传感器制做指南针
  19. 力扣-求关注者的数量
  20. Centos7安装后不显示IP地址,具体解决办法

热门文章

  1. 爬取表格类网站数据并保存为excel文件
  2. Python Cookbook(第3版)pdf
  3. eclipse package,source folder,folder区别及相互转换
  4. ECSHOP 如何删除商品列表页 购买弹出 商品属性框后面的价格
  5. ODE网络:一场颠覆RNN的革命即将到来
  6. 这4个小程序为什么有很多人在用,仅仅是因为不占手机内存空间?
  7. Vue和React组件之间的传值方式
  8. 学习用Python编程时要避免的3个错误
  9. Highcharts使用=====通过指定日期显示曲线
  10. 数据存储-传输-分析