如何解决在C中使用printf是不安全的
我是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);
}
}
解决方法
是的,这是不安全的,但并非出于您建议的原因。如果您在man
页面上查看printf()
函数,则会看到它具有以下原型:
int printf(const char * restrict format,...);
应用于第一个参数的const
修饰符指定在调用此函数时不会更改此参数的值。
但是,您还会注意到此参数称为format
。那是因为它应该指定格式字符串。在您的程序中,没有什么可以阻止用户输入诸如%p
之类的格式说明符,在这种情况下,您对printf()
的调用将开始打印堆栈的内容。有Wikipedia article详细描述了此漏洞。
函数-n 500
(如果调用成功)提供了可以输出的字符串。
如果以这种方式输出获得的字符串,则会出现问题
fgets
并包含转换说明。
所以不是那个电话
printf(pass);
使用起来更安全
printf(pass);
或
printf( "%s",pass );
初步,您可以通过调用puts(pass);
来删除存储在字符串中的换行符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。