我们先来看下面的代码 (来源于"12个有趣的C语言问答"):
#include<stdio.h>
int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10];
memset(passwd,0,sizeof(passwd));
strcpy(passwd, argv[1]);
if(0 == strcmp("LinuxGeek", passwd))
{
flag = 1;
}
if(flag)
{
printf("\n Password cracked \n");
}
else
{
printf("\n Incorrect passwd \n");
}
return 0;
}
这段关于密码验证的代码简单明了,除却argv[1]为空(用户没有给出参数)可能导致的程序崩溃问题,还有一个致命缺陷。
读者可以尝试编译以上代码并运行。当然,在参数为LinuxGeek时,控制台会正常输出显示密码正确;但是,问题出在参数的位数大于10的情况。