当前位置:必发365电子游戏 > 操作系统 > 动用更安全的C字符串操纵
动用更安全的C字符串操纵
2019-12-19

使用更安全的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 的长短超越11个字符,那么sprintf(卡塔尔的写操作就能够赶过 buf 的界限,进而发出一个缓冲区溢出。
f("hello world!"); //12 characters + nul
检查评定那类缺陷并不轻便,因为它们只在 p 的长短抢先13个字符的时候才会生出。骇客日常使用那类软弱的代码来侵略看上去安全的系统。要改革这一败笔,能够接纳函数snprintf(卡塔尔国代替函数sprintf(卡塔尔(英语:State of Qatar),函数snprintf(卡塔尔(英语:State of Qatar) 的原型为:
int
snprintf(char* buf, size_t maxlen, const char* fmt, ...);
第4个参数定义能被写到 buf 中的字符的最大个数,不思量格式标记以至源字符串的抑扬顿挫:
snprintf(buf, 10, "%10s",p); //now safe
f("hello world!"); //string is chopped to "hello worl"
诚如的,使用strncpy(卡塔尔国、strncmp(卡塔尔(英语:State of Qatar)、strncat(卡塔尔(قطر‎、strnicmp(卡塔尔(英语:State of Qatar) 和 strnset(卡塔尔(英语:State of Qatar)相应地代替strcmp(卡塔尔(英语:State of Qatar)、strcat(卡塔尔、stricmp(卡塔尔国 和 strset(卡塔尔国。举例:
const int LINE_SIZE=81;
char buf[LINE_SIZE]={0};
动用更安全的C字符串操纵。// 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 函数版本能够减少缓冲区溢出发生的大概,也不供给对原始代码进行实质的

上一篇:没有了