我有一個監聽特定端口的服務器程序。 我有一個要求,試圖連接到我的服務器的客戶端程序必須由root用戶啓動。 如何在服務器程序中確保這一點?確保root用戶正在運行試圖連接服務器程序的客戶端程序
回答
連接前,客戶端應綁定到低於1024的端口。此端口範圍爲root保留。
如何確保[任何關於 客戶端程序]服務器程序?
你不行。如果您的安全模型要求服務器知道客戶端是否爲root用戶,則表示您沒有安全性。
讓我們考慮一個可能性:你的網絡協議包括像這樣的通知:
My-Uid-Is: 0
你的客戶,你寫的完全安全的版本,有可能實現這樣的此通知:
fprintf(socketFd, "My-Uid-Is: %d\n", getuid()); // send server my identity
但是,我的客戶,即我在未經您知情或同意的情況下編寫的那一項,將執行如下通知:
fprintf(socketFd, "My-Uid-Is: 0\n"); // lie to server about my identity
流行測驗:你的服務器怎麼知道它是在跟你的真實客戶還是我說謊的客戶?答:它不能。事實上,如果你推廣這個概念,你會意識到服務器不能依賴客戶說的任何東西的有效性(是否意味着真實性,格式,範圍檢查等)。
在這種特定情況下,使用客戶端源端口號與其他選擇一樣不可靠。是的,許多操作系統需要root權限才能綁定到低編號的源端口。但是我的電腦可能沒有運行你最喜歡的操作系統。我可能會從我自己的電腦上運行我自己的操作系統,但沒有這個功能。記住:你不能相信客戶說的任何話。
有一些涉及公鑰加密的技術可以用來保證您正在與之通話的程序能夠訪問特定的祕密。假設祕密得到充分保護,可用於保證特定人員,計算機或帳戶產生請求。我會讓其他人討論PKI以及它如何適用於您的情況。
非常好的說...謝謝...但由Erik給出的解決方案提供足夠的安全性,現在...會想到公鑰加密作爲TODO – Cuurious 2011-03-08 05:08:55
- 1. 使客戶端程序等待服務器程序運行
- 2. 客戶端/服務器應用程序連接重置的Java
- 3. 客戶端應用程序與服務器的連接
- 4. 如何在UDP無連接客戶端 - 服務器對中在固定端口上運行客戶端程序
- 5. 在服務器上運行客戶端應用程序
- 6. 服務器端客戶端程序C
- 7. 服務器客戶端應用程序
- 8. 客戶端/服務器應用程序
- 9. 客戶端 - 服務器應用程序
- 10. 如何正確構建客戶端/服務器應用程序?
- 11. 將MySQL連接到Java客戶端/服務器應用程序
- 12. Exec的客戶端程序運行在服務器上
- 13. 在iPhone上運行客戶端和服務器的客戶端 - 服務器Web應用程序 - 這可能嗎?
- 14. 如何運行本地服務器/客戶端應用程序?
- 15. 如何在dev C++上運行客戶端服務器程序?
- 16. 服務器 - Android應用程序和服務器之間的客戶端連接
- 17. C客戶端在服務器客戶端應用程序中的進程ID
- 18. 多客戶端連接時C#服務器程序掛起
- 19. 修復:C++服務器/客戶端程序:「連接被拒絕」
- 20. 測試遠程客戶端 - 服務器應用程序
- 21. C#服務器客戶端應用程序(一個服務器多客戶端)
- 22. udp客戶端服務器程序c
- 23. 服務器客戶端簡單程序
- 24. c程序客戶端服務器
- 25. 客戶端服務器程序C
- 26. Java服務器,客戶端程序
- 27. RMI客戶端和服務器程序
- 28. 客戶端 - 服務器程序
- 29. (TCP)服務器/客戶端程序
- 30. TCP/UDP客戶端/服務器程序
但不是端口的拒絕服務,客戶端綁定。假設客戶想要啓動我的客戶編已經綁定的服務。 – Cuurious 2011-03-04 09:57:43
是的,該端口將被其他人攔截。然而,這是確保某些事情是根源的傳統方式。 – Erik 2011-03-04 09:59:13
您可以始終綁定,從<1024連接到服務器,然後從> 1024連接並通過根連接告訴服務器其他連接正常。 – Erik 2011-03-04 10:00:21