這篇文章主要介紹了Node.js中安全調用系統命令的方法(避免注入安全漏洞),本章講解的一般是連接字串會時出的安全問題情況,需要的朋友可以參考下。
在這篇文章中,我們將學習正確使用Node.js呼叫系統命令的方法,以避免常見的命令列注入漏洞。
我們常用的呼叫指令的方法是最簡單的child_process.exec。它有很一個簡單的使用模式;透過傳入一段字串指令,並把一個錯誤或指令處理結果回傳至回呼函數。
這裡是你透過child_process.exec呼叫系統指令一個非常典型的範例。
child_process.exec('ls', function (err, data) { console.log(data); });
不過,當你需要在你呼叫的指令中加入一些使用者輸入的參數時,會發生什麼事?顯而易見的解決方案是把使用者輸入直接和您的命令進行字串合併。但是,我多年的經驗告訴我:當你將連接的字串從一個系統發送到另一個系統時,總有一天會出問題。
var path = "user input"; child_process.exec('ls -l ' + path, function (err, data) { console.log(data); });
為什麼連接字串會出問題?
嗯,因為在child_process.exec引擎下,將呼叫執行"/bin/sh"。而不是目標程序。已發送的命令只是被傳遞給一個新的"/bin/ sh'進程來執行shell。child_process.exec的名字有一定誤導性- 這是一個bash的解釋器,而不是啟動一個程式。這意味著,所有的shell字元可能會產生毀滅性的後果,如果直接執行使用者輸入的參數。調用,他們可以使用反引號或$()來運行子命令。 🎜>
[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]像spawn和execFile採用一個額外的陣列參數,不是一個shell環境下可以執行其他指令的參數,並不會執行額外的指令。和spawn修改一下之前的例子,看看系統呼叫有何不同,以及為什麼它不容易受到指令注入。的系統呼叫 child_process.spawn
使用spawn 替換的範例很相似。 >
當使用spawn或execfile時,我們的目標是只執行一個指令(參數)。或;。使用spawn或execFile並不總是安全的。 🎜>所以,這裡有一些關於Node.js運行系統命令的指導建議:
避免使用child_process.exec,當需要包含用戶輸入的參數時更是如此,請牢記。讓使用者傳入參數,使用選擇項目比讓使用者直接輸入字串好得多。名單。