2011-10-11 6 views
0

이것은 로그인 관리자를 실행하는 서버에 대한 코드입니다.이 서버는 악의적 인 액세스를 파일에 기록하고 잘못된 로그인 결과를 인쇄합니다. chars 사용자 및 패스는 소켓을 사용하여 사용자 입력에서 왔습니다.C++에서 puts 함수가 소켓의 입력 문자와 작동하지 않는 이유는 무엇입니까?

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의 문자가있다? 새 줄은 소켓에 의한 사용자 입력에서 오는 것이므로 어떻게 피할 수 있습니까?

+0

당신이 자신에게 다음 번에 서식 수정 유효하시기 바랍니다 있습니다! –

+2

관련 없음/제안 :'strcmp (user, "admin") == 0'을 사용하지 않는 것이 어떨까요? – Marlon

+3

이 C++라고 태그했습니다. C++의 std :: string을 왜 사용하지 않는지 궁금합니다. 코드에서 세 가지 가능한 버퍼 오버 플로우 상황이있는 것처럼 보이며'std :: string'을 사용하면 거기에 없을 것입니다. * Morris 웜 *, Code Red Worm *, * SQL Slammer * 웜은 버퍼 오버 플로우를 이용한 유명한 악성 프로그램입니다. –

답변

2

으로 여러 사람들이 코드 조각은 아무것도 C++ 특정 포함에 대한 주석, 그래서 당신이 일반 C.에서 작업하는 것처럼 나는 것을

memcmp을 사용하기 때문에 내가 추측하고있어

, 대답 해요 입력 문자열은 null로 끝나지 않습니다. strcat'\0'에 도달 할 때까지 포인터가 방황하는 곳에서 char을 계속 추가합니다. C 스타일 문자열로 사용자 또는 암호를 사용하거나 strncat을 사용하고 길이를 전달하려면 널 종결자를 추가해야합니다.

또한 초과하면 msg을주의하십시오. 최대 출력 문자열 길이를 허용하기 때문에 snprintf을 사용하여 메시지 서식을 지정하는 것이 더 바람직 할 수 있습니다. 당신은 보장 할 수 있다면 문이 추가 코드를 추가

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; 
} 

코드를 조금 더 작게 만들 수

+0

좋아요. 이전에이 주석을 읽은 것을 배웠습니다. C++ 코드라고 할 수 없습니다. 그건 맞아, 순수한 C 스타일이고 내 목표에는 좋지 않아서 std : string 라이브러리를 사용했다. –

+0

순수한 C는 괜찮습니다. 올바른 방법으로 사용하는 방법을 모르겠습니다. –

1

이 방법은 이전 문자열,

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); 
+0

'printf ("% s \ n", buff)'? 왜 단지'박살 '하지 않는 것일까 요? –

+0

마법의 과거 사본, 잘 작동합니다. –

+0

음 ... 결과는 같습니다.렌 사용자 : 11 값 : 유저 패스 LEN : 16 값 : 암호 client_ip 렌 : 9 값 : 127.0.0.1 사용자와 로그인 오류 : 수퍼 암호 : password from : 127.0.0.1 놀라운 ... 나는 항상 asci 코드를보고/n이 있습니다. 이 문제를 해결할 수 있습니까? –