2

Java、Python 和其他类似的东西毁了我。我正在尝试通过响应服务器代码来自动化 FTP 客户端:

例如:

// I know this is ugly, please bear with me

char username[25];
strcat(username, USER); //"USER "
strcat(username, usr); // "foo"
strcat(username, "\n"); // = "USER foo\n"

char password[25];
strcat(password, PASS); //"PASS "
strcat(password, pswd); //"bar"
strcat(password, "\n"); // = "PASS bar\n"


//read/write loop

while (1) { 

    char* responsePtr;
    serverCode = readSocket(sockfd, mybuffer);

    if (serverCode == 221) 
                    break;

    if (serverCode == 220)
        responsePtr = &username;

    if (serverCode == 331)
        responsePtr = &password;

    writeSocket(sockfd, responsePtr);

}

当我尝试这个时,它适用于 USER,但我得到一些错误的 PASS 文本:

C->S: USER anonymous
S->C: 331 Please specify the password.
C->S: (??_?PASS random

谁能比我更聪明、更有经验给我一些 C 字符串指针?显然这不适合我。

4

4 回答 4

12

您需要在连接到它们之前初始化您的字符串。默认情况下不初始化数组。

char username[25] = "";
char password[25] = "";

对于它的价值,您可以使用它sprintf更轻松地创建字符串:

sprintf(username, "USER %s\n", usr);
sprintf(password, "PASS %s\n", pswd);

希望您也意识到使用固定大小的缓冲区是缓冲区溢出错误的秘诀。为了安全起见,您应该确保防范它们。这很烦人,但这对你来说是 C:

if (snprintf(username, 25, "USER %s\n", usr)  >= 25 ||
    snprintf(password, 25, "PASS %s\n", pswd) >= 25)
{
    fprintf(stderr, "buffer overflow\n");
    exit(EXIT_FAILURE);
}
于 2011-02-08T23:36:06.093 回答
1

一些有帮助的规则。

  • 请记住初始化和空终止您的字符串。
  • 使用库函数。
  • 在处理外部数据时检查字符串长度和/或使用 n(大小受限)函数。
  • 在调整缓冲区大小时不要忘记终止符。
于 2011-02-09T00:23:18.803 回答
0

您不应该 strcat 未初始化的数组。尝试:

char *password[25] = "";
password = strcat(PASS);

对于第一个。

此外,strcat()您应该使用strncat()来避免溢出。


我认为这样做更容易:

int len = snprintf(password, 25, "%s %s\n", PASS, pswd);
if (len > 25) {
    // oops! password is too long dude :-(
}

请参阅此处了解一些示例

于 2011-02-08T23:41:12.303 回答
-1

尝试在用户名和密码数组中添加“\n\0”而不仅仅是“\n”。

于 2011-02-08T23:40:22.623 回答