我正在编写一个客户端服务器应用程序,其中客户端从服务器端有一个确定的内存地址。
如果出现问题,服务器需要重新启动,客户端的地址已经无效了。 当使用无效信息的函数时,SIGSEGV将被发送到服务器,因为地址可能不再是它的了。
服务器如何保护自己免受SIGSEGV攻击,并继续接受连接并正常运行? 发生这种情况时有没有办法使服务器崩溃?
非常感谢你。
客户端不应该发送一个内存地址到服务器,句点。 如果客户端需要对服务器资源的引用,则服务器应该为它提供某种类型的服务器可以转换为地址的句柄,但不直接解除引用。
在你的情况下,服务器重新启动可能导致客户端的句柄无效。 服务器应该注意到这一点,并返回一个很好理解的错误代码给客户端,告诉它获得一个新的资源句柄。
管理存储指针的连接表。 如果服务器重新启动,它将重建一个新的表。 客户端只知道其连接的索引(或键或其他)。
上下文没有指定,但是发送一个指向客户端的指针可能是一个很大的安全漏洞,因为客户端可以很容易地使服务器崩溃。
而不是使用指针,使用数组或映射的索引。 这可能会导致索引被重用,但很容易检测和忽略非常无效的索引。