我是C新手,想知道指针是否可能被像strcpy()这样的脆弱c函数溢出。我在源代码中看到了很多,它是避免缓冲区溢出的一种方法吗?字符指针溢出
字符指针溢出
回答
是的。这实际上是缓冲区溢出漏洞的经典原因。避免溢出缓冲区的唯一方法是确保您不会做任何可能导致溢出的操作。在strcpy
的情况下,解决方案是使用strncpy
,其中包括要将字符串复制到的缓冲区的大小。
当然,如果你不为缓冲区分配足够的空间,那么你当然可以:
char* ptr = (char*)malloc(3);
strcpy(ptr, "this is very, very bad"); /* ptr only has 3 bytes allocated! */
然而,什么是真正糟糕的是,这种代码可以不给你任何错误的工作,但它可能在某处覆盖一些内存可能会导致您的程序在稍后发生,看似随机发生,您可能不知道为什么。这些是时间的来源(有时甚至是天)的沮丧,谁花了任何大量的时间写作C
会告诉你。
这就是为什么与C
,你必须非常小心这种事情,和双,三,第n度检查你的代码。之后,再次检查。
一些其他的方法是
#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");
}
所以其良好的知道分配的内存的大小,然后使用电话,以避免缓冲区溢出。 已编写代码的静态分析可能会指出这些类型的错误,您也可以更改它。
如果MAX_LENGTH_NAME为4(或者源字符串的长度为256个字符),则'strncpy()'调用仍会导致未定义的行为,因为'a'数组的最后一个字节仍将被初始化。 – dreamlax 2010-08-05 03:50:40
如果你知道长度不会超过某个数字,任何一个都必须这样做。否则根据需要分配,即源的长度。 Ofcourse我们还可以使用函数asprintf来处理空终止的附加字节。 – 2010-08-05 04:26:09
'snprintf'确保终止空字符适合所提供的缓冲区大小,但'strncpy'不能。 – dreamlax 2010-08-05 04:29:06
- 1. 指针,字符串和溢出错误
- 2. 如何防止字符指针缓冲区溢出?
- 3. 防止结构中的字符指针溢出
- 4. C指针,指针,字符
- 5. 获取指针字符指针的地址字符指针
- 6. 字符指针
- 7. 字符指针
- 8. 字符指针
- 9. 字符指针
- 10. 堆栈溢出或指针错误?
- 11. C中指针堆栈溢出
- 12. Ç指定字符串指针到其他字符串指针
- 13. 打印字符串流输出指针
- 14. 字符指针抛出访问冲突
- 15. 字符指针导致输出错误
- 16. 指向字符的指针
- 17. C++指针字符
- 18. 字符串指针
- 19. 迭代字符指针的指针
- 20. 动态分配字符指针,指针
- 21. 字符指针vs数组指针
- 22. 字符指针指针数组用C
- 23. 字符指针VS INT指针
- 24. 与字符指针和整数指针
- 25. 复制字符串指针,指针
- 26. 下溢或溢出的指针会发生什么?
- 27. 将字符指针分配给字符指针数组
- 28. C指针铸造:单个int指针双字符指针
- 29. 指针在C,整数指针字符指针
- 30. C - 传递和操作字符指针和指针指针
'strncpy'没有什么帮助,因为如果在目标中没有空间来终止空字符,那么就不会在那里放置(即如果源比目标大小更长)。有些人提供比实际目的地大小少的人。 – dreamlax 2010-08-04 23:10:42
'strncpy'的API使它很容易使用它,我发现它很多次都使用不正确。我不知道人们为什么如此害怕计算缓冲区大小,分配内存和使用原始函数...... – Thanatos 2010-08-05 03:52:55
@Thanatos:在这种情况下,当你从用户接收缓冲区时,你会做什么?你甚至不能安全地调用'strlen',它可能不会被NUL终止。 – torak 2010-08-05 12:18:30