2010-08-04 45 views
1

我是C新手,想知道指针是否可能被像strcpy()这样的脆弱c函数溢出。我在源代码中看到了很多,它是避免缓冲区溢出的一种方法吗?字符指针溢出

回答

1

是的。这实际上是缓冲区溢出漏洞的经典原因。避免溢出缓冲区的唯一方法是确保您不会做任何可能导致溢出的操作。在strcpy的情况下,解决方案是使用strncpy,其中包括要将字符串复制到的缓冲区的大小。

+2

'strncpy'没有什么帮助,因为如果在目标中没有空间来终止空字符,那么就不会在那里放置(即如果源比目标大小更长)。有些人提供比实际目的地大小少的人。 – dreamlax 2010-08-04 23:10:42

+0

'strncpy'的API使它很容易使用它,我发现它很多次都使用不正确。我不知道人们为什么如此害怕计算缓冲区大小,分配内存和使用原始函数...... – Thanatos 2010-08-05 03:52:55

+0

@Thanatos:在这种情况下,当你从用户接收缓冲区时,你会做什么?你甚至不能安全地调用'strlen',它可能不会被NUL终止。 – torak 2010-08-05 12:18:30

1

当然,如果你不为缓冲区分配足够的空间,那么你当然可以:

char* ptr = (char*)malloc(3); 
strcpy(ptr, "this is very, very bad"); /* ptr only has 3 bytes allocated! */ 

然而,什么是真正糟糕的是,这种代码可以不给你任何错误的工作,但它可能在某处覆盖一些内存可能会导致您的程序在稍后发生,看似随机发生,您可能不知道为什么。这些是时间的来源(有时甚至是)的沮丧,谁花了任何大量的时间写作C会告诉你。

这就是为什么与C,你必须非常小心这种事情,和双,三,第n度检查你的代码。之后,再次检查。

0

一些其他的方法是

#define MAX_LENGTH_NAME 256 

foo() 
{ 
char a[MAX_LENGTH_NAME+1]; // You can also use malloc here 

strncpy(a,"Foxy",MAX_LENGTH_NAME); 

snprintf(a,MAX_LENGTH_NAME,"%s","Foxy"); 

} 

所以其良好的知道分配的内存的大小,然后使用电话,以避免缓冲区溢出。 已编写代码的静态分析可能会指出这些类型的错误,您也可以更改它。

+0

如果MAX_LENGTH_NAME为4(或者源字符串的长度为256个字符),则'strncpy()'调用仍会导致未定义的行为,因为'a'数组的最后一个字节仍将被初始化。 – dreamlax 2010-08-05 03:50:40

+0

如果你知道长度不会超过某个数字,任何一个都必须这样做。否则根据需要分配,即源的长度。 Ofcourse我们还可以使用函数asprintf来处理空终止的附加字节。 – 2010-08-05 04:26:09

+0

'snprintf'确保终止空字符适合所提供的缓冲区大小,但'strncpy'不能。 – dreamlax 2010-08-05 04:29:06