node.js mysql防注入_避免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 */]

比如,攻擊者可以使用一個分號";"來結束命令,并開始一個新的調用,他們可以使用反引號或$()來運行子命令。還有很多潛在的濫用。

那么什么是正確的調用方式?

execFile / spawn

像spawn和execFile采用一個額外的數組參數,不是一個shell環境下可以執行其他命令的參數,并不會運行額外的命令。

讓我們使用的execFile和spawn修改一下之前的例子,看看系統調用有何不同,以及為什么它不容易受到命令注入。

child_process.execFile

var child_process = require('child_process');

var path = "."

child_process.execFile('/bin/ls', ['-l', path], function (err, result) {

console.log(result)

});

運行的系統調用

[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]

child_process.spawn

使用 spawn 替換的例子很相似。

var child_process = require('child_process');

var path = "."

var ls = child_process.spawn('/bin/ls', ['-l', path])

ls.stdout.on('data', function (data) {

console.log(data.toString());

});

運行的系統調用

[pid 26883] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */

當使用spawn或execfile時,我們的目標是只執行一個命令(參數)。這意味著用戶不能運行注入的命令,因為/bin/ls并不知道如何處理反引號或pipe或;。它的/bin/bash將要解釋的是那些命令的參數。它類似于使用將參數傳入SQL查詢(parameter),如果你熟悉的話。

但還需要警告的是:使用spawn或execFile并不總是安全的。例如,運行 /bin/find,并傳入用戶輸入參數仍有可能導致系統被攻陷。 find命令有一些選項,允許讀/寫任意文件。

所以,這里有一些關于Node.js運行系統命令的指導建議:

避免使用child_process.exec,當需要包含用戶輸入的參數時更是如此,請牢記。

盡量避免讓用戶傳入參數,使用選擇項比讓用戶直接輸入字符串要好得多。

如果你必須允許用戶輸入參數,請廣泛參考該命令的參數,確定哪些選項是安全的,并建立一個白名單。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393405.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393405.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Netbackup detected IBM drives as unusable

今天在遠程給客戶安裝NBU的時候,遇到了下面這個問題,下面的內容來至于SYMANTEC。 1,更新mapping文件 在原來也遇到過類型的故障,通過更新mapping文件后,故障解決,這次沒有那么幸運了。 2,lsscsi…

opencv python運動人體檢測

采用非極大值抑制,將重疊的框合并成一個。 # import the necessary packages from imutils.object_detection import non_max_suppression import numpy as np import imutils import cv2# initialize the HOG descriptor/person detector hog cv2.HOGDescriptor()…

php mysql 注入一句話木馬_滲透技術--SQL注入寫一句話木馬原理

講一下SQL注入中寫一句話拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 這個語句,下面是一個語句的例子:SELECT * INTO OUTFILE C:\log1.txt這樣就可以把查詢到的數據寫入到C盤的log1.txt這個文件里面。利用這個原理我們可以把PHP的一句話木馬…

開源貢獻 計算_使用此網站為開源做貢獻

開源貢獻 計算When I began the transition into being a software developer, I knew that contributing to open source projects would greatly assist my job search.當我開始過渡為軟件開發人員時,我知道為開源項目做貢獻將極大地幫助我的求職。 So, I jumped…

leetcode275. H指數 II(二分法)

給定一位研究者論文被引用次數的數組(被引用次數是非負整數),數組已經按照升序排列。編寫一個方法,計算出研究者的 h 指數。 h 指數的定義: “h 代表“高引用次數”(high citations),一名科研人…

java 多線程阻塞隊列 與 阻塞方法與和非阻塞方法

Queue是什么隊列,是一種數據結構。除了優先級隊列和LIFO隊列外,隊列都是以FIFO(先進先出)的方式對各個元素進行排序的。無論使用哪種排序方式,隊列的頭都是調用remove()或poll()移除元素的。在FIFO隊列中,所…

批量移動AD用戶到指定OU

作為域管理員,在日常工作中使用ADUC(AD用戶和計算機)工具在圖形界面中進行賬號管理操作可謂是家常便飯了。然而一個個增加、移動、刪除用戶,這樣操作有時真的夠煩,當管理大批量的賬戶時,重復操作浪費的時間…

vs 編譯說明

靜態編譯/MT,/MTD 是指使用libc和msvc相關的靜態庫(lib)。動態編譯,/MD,/MDd是指用相應的DLL版本編譯。其中字母含義 d:debug m:multi-threading(多線程) t:text代碼 d:dynamic(動態)…

python numeric_Python pandas.to_numeric函數方法的使用

pandas.to_numeric(arg, errorsraise, downcastNone) [source]將參數轉換為數字類型。默認返回dtype為float64或int64, 具體取決于提供的數據。使用downcast參數獲取其他dtype。請注意,如果傳入非常大的數字,則可能會導致精度損失。由…

javascript 分號_讓我們談談JavaScript中的分號

javascript 分號要使用它們,還是不使用它們… (To use them, or not to use them…) Semicolons in JavaScript divide the community. Some prefer to use them always, no matter what. Others like to avoid them.JavaScript中的分號分隔社區。 有些人更喜歡始終…

leetcode436. 尋找右區間(二分法)

給定一組區間,對于每一個區間 i,檢查是否存在一個區間 j,它的起始點大于或等于區間 i 的終點,這可以稱為 j 在 i 的“右側”。 對于任何區間,你需要存儲的滿足條件的區間 j 的最小索引,這意味著區間 j 有最…

python篇第6天【數據類型】

Python有五個標準的數據類型:Numbers(數字)String(字符串)List(列表)Tuple(元組)Dictionary(字典)Python數字數字數據類型用于存儲數值。他們是不…

如何確定Ionic是否適合您的項目

by Simon Grimm西蒙格里姆(Simon Grimm) 如何確定Ionic是否適合您的項目 (How to find out if Ionic is the right choice for your project) Ionic has been around for quite some years. With the latest release of version 4, it has become an even better option for d…

二維數組的查找 java_查找二維數組java的總和

我正在一個項目中,我必須讀取文件并將內容輸入2D數組。然后,我必須對每一行,每一列和矩陣的周長求和。到目前為止,除外圍功能外,我一切正常。我正在嘗試為兩個外部列的頂行,底行和中間創建單獨的for循環。矩…

遞歸法解決兔子問題

記得以前過相似問題,今天有同事問道,竟然不知所答,故寫篇文章以記之。 一般而言,兔子在出生兩個月后,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那么若干月以后可以繁…

mysql本地連接錯誤解決辦法

今天公司同事在測試服務器上死活不能用一個賬號在本地登陸,但是遠程就可以,于是我幫忙看了下,測試服務器的IP是10.10.2.226,錯誤如下:linux-0fdr:/home1/mysql_data # mysql -h 10.10.2.226 -u jxq2 -pjxq2ERROR 1045 (28000): Access denied for user jxq2linux-0fdr (using p…

leetcode546. 移除盒子(dp)

給出一些不同顏色的盒子,盒子的顏色由數字表示,即不同的數字表示不同的顏色。 你將經過若干輪操作去去掉盒子,直到所有的盒子都去掉為止。每一輪你可以移除具有相同顏色的連續 k 個盒子(k > 1),這樣一輪…

408. Valid Word Abbreviation

題目: Given a non-empty string s and an abbreviation abbr, return whether the string matches with the given abbreviation. A string such as "word" contains only the following valid abbreviations: ["word", "1ord", &qu…

oracle常用操作指令

登錄oracle用戶: sqlplus 用戶名/密碼 創建用戶:create user 要創建的用戶名 identified by 當前用戶名; 授權:grant resource,connect to 要授權的用戶名; 刪除用戶:drop user 用戶名 創建表: create table student( id n…

java接收二進制數據_java-從套接字讀取二進制數據

我正在嘗試連接到服務器,然后向其發送HTTP請求(在這種情況下為GET).這個想法是請求一個文件,然后從服務器接收它.它應同時適用于文本文件和二進制文件(例如imgs).我對文本文件沒有任何問題,它可以完美工作,但是對二進制文件有一些麻煩.首先,我聲明一個BufferedReader(用于讀取標…