[問題] 關於server接受client的shell指令之安全
大家好 我在閱讀Beej's Guide中文譯本時,不太能理解下列這段文字:
(http://beej-zhtw.netdpi.net/08-FAQ)
以下是我有疑問的一段內文 (疑問處使用綠色標記)
----------------------------------------------------------------
Q:我該怎麼寫一個 server,可以接受來自 client 的 shell 指令並執行指令呢?
client 的處理過程是:
1. 用 connect() 連線到 server
2. send("/sbin/ls > /tmp/client.out")
3. 用 close() 關閉連線
此時,server 正在處理資料並執行指令:
1. accept() client 的連線
2. 使用 recv(str) 接收命令字串
3. 用 close() 關閉連線
4. 用 system(str) 執行指令
注意!server 會執行全部 client 所送的指令,就像是提供了遠端的 shell 存取權限,人
們可以連線到你的 server 並用你的帳號做點事情。例如:若 client 送出 "rm -rf ~"
會怎麼樣呢?這會刪掉你帳號裡的全部資料,就是這樣!
所以你學聰明了,你會避免 client 使用任何危險的工具,比如 foobar 工具:
if (!strncmp(str, "foobar", 6)) {
sprintf(sysstr, "%s > /tmp/server.out", str);
system(sysstr);
}
可是這樣還是不安全,沒錯:如果 client 輸入 "foobar; rm -rf ~" 呢?
最安全的方式是寫一個小機制,將命令參數中的非字母數字字元前面放個['\']字元[如
果適合的話,要包括空白]。
如你所見,當 server 開始執行 client 送來的東西時,安全性(security)是個問題。
----------------------------------------------------------------
我的疑問如下:
1. 請問加了strncmp那個判斷式後,按照程式邏輯
假如client要請server執行"ls > file1.txt"
必須要使用"foobar ls > file1.txt"才可以嗎? 請問為什麼要這樣做呢?
2. 請問"最安全的方式是寫一個小機制"那一個方式是什麼意思呢?
目前我的程度對於程式安全還沒有什麼概念...上面這段讀了幾次還是無法看懂QQ
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.135.146.248
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1497416196.A.354.html
※ 編輯: sirusi (60.135.146.248), 06/14/2017 12:57:42
→
06/14 13:51, , 1F
06/14 13:51, 1F
→
06/14 13:51, , 2F
06/14 13:51, 2F
→
06/14 14:45, , 3F
06/14 14:45, 3F
→
06/14 14:50, , 4F
06/14 14:50, 4F
推
06/14 19:25, , 5F
06/14 19:25, 5F
→
06/14 20:17, , 6F
06/14 20:17, 6F
推
06/14 23:03, , 7F
06/14 23:03, 7F
→
06/14 23:03, , 8F
06/14 23:03, 8F
推
06/15 07:41, , 9F
06/15 07:41, 9F
→
06/15 10:05, , 10F
06/15 10:05, 10F
推
06/16 22:48, , 11F
06/16 22:48, 11F
→
06/16 22:50, , 12F
06/16 22:50, 12F
推
06/17 23:33, , 13F
06/17 23:33, 13F
→
06/18 14:45, , 14F
06/18 14:45, 14F
→
06/18 14:45, , 15F
06/18 14:45, 15F
→
06/18 14:45, , 16F
06/18 14:45, 16F
→
06/18 14:46, , 17F
06/18 14:46, 17F
→
06/18 14:46, , 18F
06/18 14:46, 18F