游戏服务器开发点滴用C/C++编写服务器,那么最头疼的莫过于野指针以及内存读写溢出。 今天记录的是昨天发现的一个服务器宕机BUG,使用来自客户端发送的字符串,使用时可能会导致宕机。 在通信中使用了定长char数组: char account[20]; 那么发送过来的名称,正常应该是有结束符的。而如果非法客户端,发送过来的这个char数组没有结束符。 我们直接拿account作为const char* 进行字符串相关操作,就有安全问题。 即便不是非法客户端,也有可能有问题,比如: 某第三方服务,发送一个字符串过来,它认为account有30个字节,"aaaaaaaaaaaaaaaaaaaaaaaaaaa", 结果序列化到网络的时候, char account[20]截取了其中20个字节,然而就没有结束符了,所以仍然不安全。
-- 对于这点,几年前就警惕过自己,处理方式是接收到客户端的网络消息包结构,都直接预先将其末尾设置为结束符。 比如: account[sizeof(account)-1] = 0;
可程序员总有疏忽的时候。
另外,以后不应该是用定长数组,因为一旦决定(比如第三方决定增加用户名称长度)更改容量,那么需要重新定义数组,程序需要重新编译,打包。 ---- 如果使用protobuf,那么只需要进行read到某协议类型,如果失败了,就不管,成功了直接用就是。 无需关心类似char数组这种低阶的安全问题。 |
|