2010-03-24 52 views
4

我正在写一个客户端服务器应用程序,其中客户端从服务器端有一个确定的内存地址。如何“避免”一个SIGSEGV?

如果出现问题并且服务器需要重新启动,客户端拥有的地址不再有效。当使用使用该无效信息的函数时,SIGSEGV将被发送到服务器,因为地址可能不再是它的了。

服务器如何保护自己免受SIGSEGV攻击并继续接受连接并正常运行?发生这种情况时有没有办法使服务器崩溃?

非常感谢。

+1

你是否将内存地址传递给客户端,然后返回服务器? – Yaroslav 2010-03-24 20:02:25

回答

12

客户端不应该发送内存地址到服务器,句点。如果客户端需要对服务器资源的引用,服务器应该为它提供某种类型的服务器可以转换为地址的句柄,但不直接解除引用。

在你的情况,服务器重新启动可能导致客户端的句柄无效。服务器应该注意到这一点,并向客户端返回一个理解错误的代码,告诉它获得一个新的资源句柄。

+2

现货。传递指针服务器到客户端,反之亦然是相当疯狂:) – MarkR 2010-03-24 22:47:27

+0

没错。在这种情况下,就VMM而言,服务器就像内核一样工作。它必须维护一个什么处理点到什么实际地址的列表。 – 2010-03-26 05:04:47

0

管理存储指针的连接表。如果服务器重新启动,它将重建一个新表。客户端只知道其连接的索引(或键或其他)。

未指定上下文,但向客户端发送指针可能是一个很大的安全漏洞,因为客户端可能会非常轻松地使服务器崩溃。

0

而不是使用指针,使用数组或地图的索引。这可能会导致索引被重用,但很容易检测并忽略非常无效的索引。