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

役立ついくつかのルール。

  • 文字列を初期化して null で終了することを忘れないでください。
  • ライブラリ関数を使用します。
  • 外部データを操作する場合は、文字列の長さを確認するか、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」だけでなく「\n\0」を追加してみてください。

于 2011-02-08T23:40:22.623 に答える