首頁 >web前端 >js教程 >Node.js中安全地呼叫系統指令的方法(避免注入安全漏洞)

Node.js中安全地呼叫系統指令的方法(避免注入安全漏洞)

PHPz
PHPz原創
2016-05-16 16:29:071621瀏覽

這篇文章主要介紹了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,當需要包含用戶輸入的參數時更是如此,請牢記。讓使用者傳入參數,使用選擇項目比讓使用者直接輸入字串好得多。名單。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn