这是我运行登录管理器的服务器的代码,即登录恶意访问的文件并打印出错误登录的结果。 chars user和pass来自使用套接字的用户输入。
if ((memcmp(user, "admin", strlen("admin")) == 0)) {
/*code... */
}
else {
char msg[600];
strcpy (msg,"Login error with ");
strcat (msg,"user: ");
strcat (msg,user);
strcat (msg," password: ");
strcat (msg,pass);
strcat (msg," from: ");
strcat (msg, client_ip);
puts (msg);
logfile->Write(msg);
return false;
}
嗯,问题是输出控制台和日志文件中的输出。
像这样:
Login error with user: lol
password: asd
:��ܔ��P{w� from: 127.0.0.1
为什么有奇怪的asci字符? 如何避免新行,因为它们来自socket的用户输入?
答案 0 :(得分:2)
正如多个人所评论的那样,这段代码不包含特定于C ++的内容,所以我回答的问题就好像你在普通的C中工作一样。
我猜,因为你使用上面的memcmp
,你的输入字符串不会以空值终止。 strcat
将继续追踪char
来自指针徘徊的内容,直到它遇到'\0'
。如果要将用户或密码用作C风格的字符串,则需要添加空终止符,否则使用strncat
并传递长度。
另外,请注意超越msg
。使用snprintf
格式化邮件可能会更好,因为它接受最大输出字符串长度。
答案 1 :(得分:1)
通过这种方式,您可以使代码更小一些
if (strcmp(user, "admin") == 0) {
/* yahoo, admin! */
}
else {
char buff[256];
snprintf(buff, sizeof(buff),
"Login error with user: %s password: %s from: %s",
user,
pass,
client_ip);
printf("%s\n", buff);
logfile->Write(buff);
return false;
}
在if语句之前添加此额外代码,您可以确保字符串有效
printf("user, len:%d, value: %s\n", strlen(user), user);
printf("pass, len:%d, value: %s\n", strlen(pass), pass);
printf("client_ip, len:%d, value: %s\n", strlen(client_ip), client_ip);