0

这是我运行登录管理器的服务器的代码,它登录到恶意访问的文件并打印出错误登录的结果。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 字符?如何避免新行,因为它们来自套接字的用户输入?

4

2 回答 2

2

正如多人评论的那样,这段代码不包含任何特定于 C++ 的内容,所以我的回答就像你在使用纯 C 语言一样。

我猜,由于您memcmp在上面使用,您的输入字符串不是以空值结尾的。 strcat将继续char从指针徘徊的任何地方附加 s ,直到它遇到'\0'. 如果要将用户或密码用作 C 样式字符串,则需要添加空终止符,或者使用strncat并传递长度。

另外,请注意超限msg。使用格式化消息可能会更好snprintf,因为它接受最大输出字符串长度。

于 2011-10-11T22:52:25.657 回答
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);
于 2011-10-11T23:12:23.307 回答