c - C中的recv()是否可能存在缓冲区溢出?

标签 c buffer-overflow 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 操作吗?

最佳答案

send(client_fd, "登录:", BUFSIZE, 0);

-- 对于此语句,send 将尝试发送 BUFSIZE 字节,尽管您的字符串只是“Login:”。 send 本质上并不尝试理解“C”字符串。它只识别字节流。因此,您的发送语句不正确。

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

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

关于c - C中的recv()是否可能存在缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9565399/

相关文章:

c - 使用递归但按某种顺序获取值的阶乘

无法理解为什么我会收到异常抛出错误

c - 缓冲区溢出错误变量改变值

c++ - 使用 Winsock 读取所有信息时结束 "recv()"循环

c - recv() 什么时候返回?

c++ - winsock - recv - 网络连接问题

c - 动态数据结构

c - 如何停止 CSE 不要重复 CSE

c - strcpy 的基本缓冲区溢出

c - 缓冲区溢出,用 snprintf 代替 char 调整大小?