【发布时间】:2021-01-10 12:32:13
【问题描述】:
我是 C 的新手,所以我开始玩一些代码。我的代码中有一个错误,因为我认为使用 printf(pass) 不安全,因为它可以覆盖该值,因此对用户不安全。我想知道printf(pass) 在我的代码中是不安全的吗?另外,我怎样才能让用户在不更改代码的情况下打印消息finally logged in。有什么办法吗?
我的代码:
#include <stdio.h>
char pass[100];
char getPass() {
int value = 'G';
int * j = & value;
fgets(pass, sizeof(pass), stdin);
printf("your entered pass is ");
printf(pass);
return (char)( * j);
}
void main() {
printf("enter the pass here ");
if (getPass() == 'K') {
printf("finally logged in\n");
exit(0);
} else {
printf("Wrong password\n");
exit(1);
}
}
【问题讨论】:
-
“它可以覆盖值” - 什么值?你担心覆盖什么?
printf只写信给stdout所以不清楚这里有什么不安全的地方 -
你多次提到
print。你的意思是printf?此外,如果您对其应用一些标准缩进,您的代码会更容易阅读。 -
@UnholySheep 我的意思是如果它覆盖任何用户键入的密码。用户也可以使用错误的密码登录。
-
@TomKarzes 抱歉,我已经缩进了我的代码。而且,是的,我的意思是 printf。我的意思是它是缓冲区溢出漏洞吗?
-
@Sky Right。这应该是显而易见的。如果密码是
%s%d%p%x,会发生什么?你认为printf会对这样的格式字符串做什么?它会寻找不存在的其他参数,因此它可能会出现段错误,或者它可能会拾取一些垃圾值然后扩展它们。它不会做的一件事是打印密码。