像strcpy,gets等函数总是很危险吗?如果我写这样的代码怎么办:
int main(void)
{
char *str1 = "abcdefghijklmnop";
char *str2 = malloc(100);
strcpy(str2, str1);
}
Run Code Online (Sandbox Code Playgroud)
这样,函数不接受参数(参数...),并且str变量将始终具有相同的长度...这里是16或稍微多一些,具体取决于编译器版本......但是100可以满足3月,2011年:).有没有办法让黑客利用上面的代码?10倍!
Mat*_*hen 13
绝对不.与微软针对其非标准功能的营销活动相反,如果使用得当,strcpy则是安全的.
以上是多余的,但大多数是安全的.唯一可能的问题是你没有检查malloc返回值,因此你可能正在取消引用null(如kotlinski所指出的).实际上,这可能会立即导致SIGSEGV和程序终止.
不正当和危险的用途是:
char array[100];
// ... Read line into uncheckedInput
// Extract substring without checking length
strcpy(array, uncheckedInput + 10);
Run Code Online (Sandbox Code Playgroud)
这是不安全的,因为strcpy可能会溢出,导致未定义的行为.实际上,这很可能会覆盖其他局部变量(本身就是一个主要的安全漏洞).其中一个可能是返回地址.通过返回lib C攻击,攻击者可能能够使用C函数system来执行任意程序.溢出还有其他可能的后果.
但是,gets确实本质上是不安全的,并将从下一版本的C(C1X)中删除.根本没有办法确保输入不会溢出(导致上面给出的相同后果).有些人认为与已知输入文件一起使用时是安全的,但实际上没有理由使用它.POSIX getline是一个更好的选择.
此外,长度str1不会因编译器而异.它应该总是17,包括终止NUL.
你强行将完全不同的东西归为一类。
函数gets确实总是危险的。gets无论您愿意采取什么步骤以及您愿意采取何种防御措施,都无法安全地做出决定。
strcpy如果您愿意采取 [简单] 必要步骤来确保您的调用安全,则函数是完全strcpy安全的。
已经放gets并strcpy在完全不同的类别,其中没有任何共同点关于安全。
针对安全方面的流行批评strcpy完全基于轶事社会观察而不是正式事实,例如“程序员是懒惰和无能的,所以不要让他们使用strcpy”。在 C 编程的上下文中,这当然是无稽之谈。按照这个逻辑,出于完全相同的原因,我们还应该声明除法运算符完全不安全。
实际上,没有任何问题strcpy。gets另一方面,正如我上面所说,这是一个完全不同的故事。
是的,这很危险。经过5年的维护,您的代码将如下所示:
int main(void)
{
char *str1 = "abcdefghijklmnop";
{enough lines have been inserted here so as to not have str1 and str2 nice and close to each other on the screen}
char *str2 = malloc(100);
strcpy(str2, str1);
}
Run Code Online (Sandbox Code Playgroud)
到那时,有人会去并将str1更改为
str1 =“这是一个非常长的字符串,现在它将超载任何用于复制它的缓冲区,除非要进行预防,以检查该字符串的限制。并且,如果在5年内解决一个问题,则有足够的人记得这样做。盗版计划”
忘了看在哪里使用str1,然后随机错误将开始发生...
| 归档时间: |
|
| 查看次数: |
7307 次 |
| 最近记录: |