2012-03-05 2 views
0

Мне интересно о переполнении буфера в моем приложении. Например, у меня есть этот код:Возможно ли иметь переполнение буфера в recv() в C?

enum { BUFSIZE = 1024}; 
    char username[this->BUFSIZE]; 
    memset(username,0,BUFSIZE); 
    char password[this->BUFSIZE]; 
    memset(password,0,BUFSIZE); 

    send(client_fd, "Login: ", BUFSIZE, 0); 
    recv(client_fd,username,sizeof(username),0) 

Может злоумышленник типа более 1024 символов и сделать кислородный конвертер?

+1

Не забывайте, что для строк C требуется место для символа окончания '' \ 0''. В настоящее время операция UDP может полностью заполнить ваше имя пользователя, создавая недействительную строку C, что может привести к сбою вашей программы позже. Проверьте возвращаемое значение recv, чтобы поймать это и добавить '\ 0' самостоятельно. – Zeta

ответ

0

отправить (client_fd, "Login:", BUFSIZE, 0);

- Для этого оператора send попытается отправить байты BUFSIZE, хотя ваша строка является только «Login:». send не по своей сути пытается понять строку 'C'. Он просто распознает поток байтов. Таким образом, ваше заявление для отправки неверно.

RECV (client_fd, имя пользователя, SizeOf (имя пользователя), 0)

- В случае RECV, хотя вы упомянули "SizeOf (имя пользователя)", это не означает, что он будет возвращать «SizeOf (username) ", количество возвращаемых байтов может быть найдено с использованием возвращаемого значения recv. Никогда не пытайтесь интерпретировать содержимое буфера, переданного в recv, без проверки возвращаемого значения recv. Но указание sizeof (username) гарантирует, что recv-вызов не вернет больше байтов sizeof (username), даже если в сетевом буфере присутствует большее количество байтов.