引用:
strncpy(buf, argv<1>, 1024);
strncpy(buf2, argv<2>, 256); /* 这里可能导致buf2未中断 */
是不是应该strncpy(buf1, argv<1>, 1024);?
今天才有空看了一下...为了提高论坛的学术交流气氛 我也来参与讨论吧..
PS:
嫌我菜者 一律强奸
strncpy确实有不安全的因素 看你怎么用了 不过任何的函数基本
都有这种临界状态
而提供strncpy的目的也
并不是为了让他比strcpy更安全 而
仅仅是为了可以指定n比strcpy更方便而已
方便和安全还是不能划等号的...
下面说说菜鸟冰血封情对此问题的理解 关键应该是在于临界状态
先看原型 这样方面我后面ggyy
char *strcpy(char *destination, const char *source, size_t n);
destination的空间必须要大于等于n就不用说了 这JB都是废话
如果source中包含字符数
少于n个 那么拷贝完成后就会在destination的最后加上空字符
但是 如果source拷贝的时候n是
大于或者等于destination的空间大小 那么 就不会在destination的末尾加上空字符的
然后最后 返回destination
那么Sunwear给出的flashsky例子的情况 恰恰就是讨论这种
临界状态的
但是只是一个需要注意的问题 并非函数本身的问题 没有用好 才会出现长度相等不添加空字符的现象
buf2在前面被声明成256
但是后面却用argv[2]的前256个拷贝填入buf2 这种问题在我学C的时候 书上
专门提出来说了 看来基础是很重要的 我一定要好好学习 追上Sunwear
引用:
strncpy(buf2, argv<2>, 256);
第一 如果argv[2]的前256个字符的最后一个是空字符(或者说包含空字符) 那么自然没有问题
第二 但是如果argv[2]的前256个字符最后一个不是空字符(或者说包含空字符) 那么 由于buf2里本来只有256个空间 已经满了 就无法自动添加空字符了 因为没空间了填个毛呀?strncpy自动添空字符的条件是 有足够的空间 至少最后有那么一个字节
由于 有第二种可能性存在 所以例子中才会说
可能 因为不一定
那么很容易看见 其实
引用:
strcpy(buf1, argv<1>, 1024);
同样有
可能存在这种问题...
完全取决于程序员的操作 当然编译器
不会报错 并非语法错误 报根毛? 这就是为什么这个
本来没有讨论价值的问题
开始有了那么一点点价值 而被善于操作
细节的焦点高手提出来专门说了 可见注重细节的优点是很重要的
其实不难发现
flashsky的讨论主要集中的
不是在错误或者说疏忽使用这个拷贝函数上
而是在于
不负责的程序员总是假设用户输入的数据是符合他们的想法的 而忽略了恶意用户的存在 没有考虑临界状态 而作为优秀的程序员 你必须考虑到用户输入的所有可能
因此 以前的旧程序里一定有相当部分存在这样类似的安全缺陷 而flashsky大哥的意思也只是抛砖引玉的告诉大家 这个不起眼的安全缺陷
存在可被利用的价值...
SB冰血封情意见如上 高手斧正 谢谢:)
下次讨论利用价值...NND 要迟到了