2012-03-05 36 views
0

我想知道我的应用程序的缓冲区溢出。 例如,我有这样的代码:在C中recv()有可能发生缓冲区溢出吗?

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个字符,可以做一个BOF?

+1

不要忘记C字符串需要终止符号''\ 0''的空格。目前,UDP操作可能会完全填充您的用户名,导致呈现无效的C字符串,这可能会在稍后导致程序崩溃。检查recv的返回值来捕获它并自己添加一个'\ 0'。 – Zeta

回答

0

send(client_fd,“Login:”,BUFSIZE,0);

- 对于此语句,send将尝试发送BUFSIZE个字节,尽管您的字符串只是“Login:”。发送并不固有地尝试理解'C'字符串。它只是识别一个字节流。所以,您的发送声明不正确。

的recv(client_fd,用户名的sizeof(用户名),0)

- 在recv的情况下,虽然你刚才提到 “的sizeof(用户名)”,但这并不意味着它会返回“的sizeof(用户名)“字节,可以使用recv的返回值找出返回的字节数。切勿尝试解释传递给recv的缓冲区的内容,而不检查recv的返回值。但是,指定sizeof(用户名)确保即使网络缓冲区中存在更多字节数量,recv调用也不会返回大于sizeof(用户名)字节的大小。