SQL隱碼攻擊漏洞威脅網路安全 防禦措施應從編碼開始做起

zktq2021發表於2021-12-29

在Colonial Pipeline網路攻擊事件和其他備受矚目的案例之後,IT團隊可能正在努力加強他們的端點保護。但開發者社群的人知道,安全漏洞並不是從這裡開始和結束的。如果是不恰當地編寫程式碼或安全性不足,也就意味著在為未來的網路攻擊編寫程式碼。

對於科技公司來說,Web漏洞是一個影響甚大的問題。它們涵蓋了許多不同的編碼問題,在上述攻擊事件中包括一個非常具體的型別。

SQL隱碼攻擊是最危險和最常見的漏洞之一,但幸運的是,開發人員可以遵循一些最佳實踐來確保安全防護的縫隙相對較小。

首先是確保客戶端輸入驗證不是唯一的防線。這種驗證對於改進使用者體驗來說是一個很好的工具,但它不能作為一種安全機制。

透過更改瀏覽器中載入的JavaScript程式碼或使用導致SQL隱碼攻擊的引數對客戶端-伺服器架構中的後端進行基本HTTP呼叫,可以很容易地刪除客戶端驗證。開發人員應該將客戶端傳送的所有資訊視為潛在的有害資訊,因此應該在伺服器端進行驗證,理想情況下應該儘可能接近源。

開發人員還應該仔細考慮資料庫使用者許可權。所有SQL隱碼攻擊都是有害的,但有些攻擊比其他的更有害:訪問使用者資訊是一回事,而修改或刪除使用者資訊則是另一回事。

為了最小化SQL隱碼攻擊的影響,開發人員應該對應用程式在資料庫上的許可權進行戰略性的考慮。一個特定的應用程式真的需要讀取、寫入和更新所有資料庫的能力嗎?它是否必須能夠截斷或刪除表?

除了不允許每個應用程式自由支配一個資料庫之外,一個應用程式只有一個資料庫使用者也是不明智的。建立多個資料庫使用者並將他們連線到特定的應用程式角色的工作方式與防火門的工作方式相同:它可以防止攻擊者快速接管整個資料庫。

引數是很好的防禦

開發人員保護自己的一個關鍵方法是使用預處理語句和查詢引數化。許多語言都有內建的特性來幫助防止SQL隱碼攻擊,因此在編寫SQL查詢時,可以使用準備好的語句來編譯查詢。

準備好的語句可用於執行查詢引數化,這限制了可以輸入的SQL語句:開發人員建立一個帶有佔位符的基本查詢,然後使用者給定的引數可以安全地附加到這些佔位符上。當使用預處理語句和引數化查詢時,資料庫將首先基於帶有佔位符的查詢字串構建查詢執行計劃,然後將(不受信任的)引數傳送給資料庫。

由於已經建立了查詢計劃,因此引數不再影響此操作,並且完全阻止了注入。因此,帶有查詢引數化的預處理語句是對SQL隱碼攻擊的很好防禦措施。

在使用儲存過程時,引數化也是非常重要的。許多人認為使用儲存過程是防止SQL隱碼攻擊的好方法,但情況並非總是如此。就像在應用程式中建立的任何SQL查詢一樣,儲存過程也可能被惡意注入。因此,與SQL查詢一樣,開發人員應該在儲存過程中引數化查詢,而不是連線引數,以防止注入。

然而,在某些情況下,預處理語句是不可用的。如果某種語言不支援預處理語句,或者較舊的資料庫不允許開發人員將使用者輸入作為引數提供,那麼輸入驗證是一種可接受的替代方法。

團隊應該確保輸入驗證依賴於允許列表而不是阻止列表——使用維護良好的庫或建立一個規則來描述所有允許的模式,例如,使用正規表示式。當然,即使準備好的語句可用,輸入驗證也是必須的。

多層次安全,嚴格檢查

除了引數化和輸入驗證之外,開發人員還應考慮使用物件關係對映( ORM ) 層來防止注入。這將資料從資料庫轉換為物件,反之亦然,從而減少了顯式SQL查詢降低SQL隱碼攻擊的風險。但是需要注意的是,如果使用錯誤或過時的Sequelize或 Hibernate版本,ORM庫中仍然會出現漏洞,因此開發人員必須保持警惕。

最終,也是需要重視的一點是,無論部署什麼安全策略,都必須有一個嚴格的審查系統來審查程式碼並標記發現的漏洞。為了確保較高的安全性,開發人員應該使用安全可控的專業靜態程式碼掃描工具來自動檢查SQL隱碼攻擊漏洞並顯示出程式碼中的缺陷問題。

SQL隱碼攻擊是一種危險的網路威脅,好在可以防禦。透過嚴格的 靜態程式碼檢測查詢漏洞並修復,可以有效提高程式碼質量從而加強軟體安全,進而阻止注入攻擊。隨著網路犯罪與數字化同步增長,開發人員將安全性寫入程式碼的核心觀念,比以往任何時候都更加重要。


參讀連結:

https://www.helpnetsecurity.com/2021/09/08/preventing-sql-injection-attacks/


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70000012/viewspace-2849870/,如需轉載,請註明出處,否則將追究法律責任。

相關文章