char在函数内和函数外有什么区别?
What is the difference between char in a function and outside a function?
我有 2 个示例代码,其中一个可以安全防止缓冲区溢出,即使使用
gcc -fno-stack-protector -fno-pie -m32 save.c -o save
安全程序代码:
#include <stdio.h>
char check[16];
int main(int argc, char **argv) {
printf("Enter a string: ");
gets(check);
printf("%s\n", check);
printf("Accepted.\n");
}
不安全(易受攻击)程序代码:
#include <stdio.h>
int main(int argc, char **argv) {
char check[16];
printf("Enter a string: ");
gets(check);
printf("%s\n", check);
printf("Accepted.\n");
}
为什么char在程序外"safe"? (以我为例)
在第一种情况下,您要声明一个全局变量。由于多种原因,这通常是一个坏习惯,随着时间的推移,您会发现其中的许多原因,因此最好永远不要这样做,除非您别无选择。
第二种情况使其在 main()
本地。
更好的方法是制作一个执行get-assign操作和returns char*
.
的函数
值得注意的是,在这两种情况下,此程序没有任何安全之处,因为您使用的是可笑的小缓冲区(16 字节!)并且永远不要使用缓冲功能长度有限。 gets
是最糟糕的使用之一。考虑别的事情,任何事情,甚至 scanf('%15s', &check)
.
将缓冲区从一个位置移动到另一个位置并不会使其更安全。问题在于缓冲区及其使用方式。
我有 2 个示例代码,其中一个可以安全防止缓冲区溢出,即使使用
gcc -fno-stack-protector -fno-pie -m32 save.c -o save
安全程序代码:
#include <stdio.h>
char check[16];
int main(int argc, char **argv) {
printf("Enter a string: ");
gets(check);
printf("%s\n", check);
printf("Accepted.\n");
}
不安全(易受攻击)程序代码:
#include <stdio.h>
int main(int argc, char **argv) {
char check[16];
printf("Enter a string: ");
gets(check);
printf("%s\n", check);
printf("Accepted.\n");
}
为什么char在程序外"safe"? (以我为例)
在第一种情况下,您要声明一个全局变量。由于多种原因,这通常是一个坏习惯,随着时间的推移,您会发现其中的许多原因,因此最好永远不要这样做,除非您别无选择。
第二种情况使其在 main()
本地。
更好的方法是制作一个执行get-assign操作和returns char*
.
值得注意的是,在这两种情况下,此程序没有任何安全之处,因为您使用的是可笑的小缓冲区(16 字节!)并且永远不要使用缓冲功能长度有限。 gets
是最糟糕的使用之一。考虑别的事情,任何事情,甚至 scanf('%15s', &check)
.
将缓冲区从一个位置移动到另一个位置并不会使其更安全。问题在于缓冲区及其使用方式。