2016-07-14 317 views
1

這是設置。確保自己免受nodejs中sql注入的最佳方式

我使用AJAX的,我派人程序服務器的NodeJS的參數發送POST。在這個特定的情況下,用戶名和代碼。

這POST調用來request.GET中執行使用這兩個參數的過程的Web服務。

例如

app.post('url/:username/:code', function(req,res,next){ 

var procedure = 'EXECUTE procedureName'+req.params.code; 

    request.get('myWslink/myService.asmx/service? 
    callback=&userName='+req.params.username+'&procedureName='+procedure, function(){}); 
}); 

前端用戶無法看到我的web服務的URL,我的網址request.GET中或我的過程名,但他仍然可以看到正在發送的參數(用戶名,密碼) 他能改變這些參數使他能夠執行他不應該執行的程序。

他還可以調用一個POST請求一堆次,並用一堆垃圾填滿的數據庫,如果它是一個插入過程。

保護自己免受這些攻擊的最佳方法是什麼?

+0

最好的辦法是不動態傳遞過程的名稱來執行。至少你應該使用一些加密來混淆。 –

回答

1

這裏有幾點建議:

不要在這個程度上進行元編程。爲每個程序在你的申請上分開路線,然後自己注入這些「代碼」。這將允許您執行諸如驗證用戶輸入以確保不會傳入垃圾數據以及限制特定路由的比率以確保數據庫未填滿垃圾。

您還可以創建允許的「代碼」白名單陣列,並確保whitelist.instanceOf(procedure) != -1,但這不會讓你做的每路輸入驗證。

即使您手動包含該過程,仍然存在問題。在您現有的代碼中,調用外部服務將'req.params.username'參數放在procedureName之前。對於大多數HTTP解析框架,參數先到先得。我在看到此代碼後嘗試的第一次攻擊之一是將 '&procedureName=something_i_shouldnt_be_able_to_call' 注入我的用戶名。這會導致您包含的procedureName屬性被忽略,而我提交的那個將被用來代替。您可以通過將基於用戶輸入的參數放在最後並在字符串插值之前將用戶輸入URI編碼,或者將查詢字符串包含爲名爲'qs'的對象來阻止此操作。passed into the options argument to request.

無論這是否創建SQL注入漏洞完全取決於Web服務如何分析參數並執行該過程。最佳情況是服務URI解碼每個參數,然後將這些參數作爲參數傳遞給PDO或準備好的語句。我的猜測是它正在使用PDO,只要它被調用。

所以,我最終會建議這裏是URI編碼每個用戶輸入提供的參數,並使用上面提到的QS對象傳遞到請求選項,而不是僅僅插字符串。完成之後,您可以採取以下任意或全部步驟來驗證:

  1. 嘗試執行諸如手動向用戶輸入中注入單引號的操作。
  2. 在該特定路由上運行一個像sqlmap這樣的工具來測試SQL注入。這將給你一個相當強大的測試,而不需要深入瞭解SQL注入技術。
  3. 使用經驗豐富的node.js安全專業人員安排應用程序安全評估。 (我可以在liftsecurity.io

要重申 - 不要相信用戶給你的程序代碼 - 使獨立路線和自己插入數據,URI編碼進一步處理之前,所有的用戶輸入,並使用請求選項對象,如:{qs:{name:value}}而不是字符串插值。

有了這些保護,你可能會很好,因爲它似乎在這裏使用存儲過程。除非您可以在Web服務的文檔中找到對此的確認,否則唯一可以確定的方法是通過我上面建議的方法之一。

希望這會有所幫助!

0

爲了防止SQL注入,你可以逃脫你的web服務的輸入數據。 ,爲避免數據庫中存在多個虛假條目,您可以爲每個帖子請求添加一個唯一標記,並在您的web服務上驗證該標記。如果標記合法,則允許插入,如果不是,則避免插入。 您正在使用Web服務,因爲我認爲您必須將這些標記保留在數據庫中以進行驗證。

+0

如何在我的web服務上逃避輸入數據? –

+0

另外,如果你可以發佈一些引用來處理web服務上的獨特的標記,我會非常感激。 –