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

なぜ奇妙な子嚢文字があるのですか?新しい行はソケットによるユーザー入力から来るので、どうすれば回避できますか?

4

2 に答える 2

2

複数の人がコメントしているように、このコードのスニペットには C++ 固有のものは何も含まれていないため、プレーン C で作業しているかのように回答しています。

memcmp上記を使用しているため、入力文字列が null で終了していないと 推測しています。ポインタがさまようものから s に遭遇するまで sstrcatを追加し続けます。ユーザーまたはパスワードを C スタイルの文字列として使用する場合は、ヌル ターミネータを追加する必要があります。それ以外の場合は、長さを使用して渡します。char'\0'strncat

また、オーバーランに注意してくださいmsgsnprintf出力文字列の最大長を受け入れるため、メッセージをフォーマットするためにを使用するとうまくいくかもしれません。

于 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 に答える