2010-03-24 53 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

而不是使用指針,使用數組或地圖的索引。這可能會導致索引被重用,但很容易檢測並忽略非常無效的索引。