SQL注入漏洞威脅網(wǎng)絡安全 防御措施應從編碼開始做起
在Colonial Pipeline網(wǎng)絡攻擊事件和其他備受矚目的案例之后,IT團隊可能正在努力加強他們的端點保護。但開發(fā)者社區(qū)的人知道,安全漏洞并不是從這里開始和結束的。如果是不恰當?shù)鼐帉懘a或安全性不足,也就意味著在為未來的網(wǎng)絡攻擊編寫代碼。
對于科技公司來說,Web漏洞是一個影響甚大的問題。它們涵蓋了許多不同的編碼問題,在上述攻擊事件中包括一個非常具體的類型。
SQL注入是最危險和最常見的漏洞之一,但幸運的是,開發(fā)人員可以遵循一些最佳實踐來確保安全防護的縫隙相對較小。
首先是確??蛻舳溯斎腧炞C不是唯一的防線。這種驗證對于改進用戶體驗來說是一個很好的工具,但它不能作為一種安全機制。
通過更改瀏覽器中加載的JavaScript代碼或使用導致SQL注入的參數(shù)對客戶端-服務器架構中的后端進行基本HTTP調用,可以很容易地刪除客戶端驗證。開發(fā)人員應該將客戶端發(fā)送的所有信息視為潛在的有害信息,因此應該在服務器端進行驗證,理想情況下應該盡可能接近源。
開發(fā)人員還應該仔細考慮數(shù)據(jù)庫用戶權限。所有SQL注入攻擊都是有害的,但有些攻擊比其他的更有害:訪問用戶信息是一回事,而修改或刪除用戶信息則是另一回事。
為了最小化SQL注入的影響,開發(fā)人員應該對應用程序在數(shù)據(jù)庫上的權限進行戰(zhàn)略性的考慮。一個特定的應用程序真的需要讀取、寫入和更新所有數(shù)據(jù)庫的能力嗎?它是否必須能夠截斷或刪除表?
除了不允許每個應用程序自由支配一個數(shù)據(jù)庫之外,一個應用程序只有一個數(shù)據(jù)庫用戶也是不明智的。創(chuàng)建多個數(shù)據(jù)庫用戶并將他們連接到特定的應用程序角色的工作方式與防火門的工作方式相同:它可以防止攻擊者快速接管整個數(shù)據(jù)庫。
參數(shù)是很好的防御
開發(fā)人員保護自己的一個關鍵方法是使用預處理語句和查詢參數(shù)化。許多語言都有內置的特性來幫助防止SQL注入,因此在編寫SQL查詢時,可以使用準備好的語句來編譯查詢。
準備好的語句可用于執(zhí)行查詢參數(shù)化,這限制了可以輸入的SQL語句:開發(fā)人員創(chuàng)建一個帶有占位符的基本查詢,然后用戶給定的參數(shù)可以安全地附加到這些占位符上。當使用預處理語句和參數(shù)化查詢時,數(shù)據(jù)庫將首先基于帶有占位符的查詢字符串構建查詢執(zhí)行計劃,然后將(不受信任的)參數(shù)發(fā)送給數(shù)據(jù)庫。
由于已經(jīng)創(chuàng)建了查詢計劃,因此參數(shù)不再影響此操作,并且完全阻止了注入。因此,帶有查詢參數(shù)化的預處理語句是對SQL注入的很好防御措施。
在使用存儲過程時,參數(shù)化也是非常重要的。許多人認為使用存儲過程是防止SQL注入的好方法,但情況并非總是如此。就像在應用程序中創(chuàng)建的任何SQL查詢一樣,存儲過程也可能被惡意注入。因此,與SQL查詢一樣,開發(fā)人員應該在存儲過程中參數(shù)化查詢,而不是連接參數(shù),以防止注入。
然而,在某些情況下,預處理語句是不可用的。如果某種語言不支持預處理語句,或者較舊的數(shù)據(jù)庫不允許開發(fā)人員將用戶輸入作為參數(shù)提供,那么輸入驗證是一種可接受的替代方法。
團隊應該確保輸入驗證依賴于允許列表而不是阻止列表——使用維護良好的庫或創(chuàng)建一個規(guī)則來描述所有允許的模式,例如,使用正則表達式。當然,即使準備好的語句可用,輸入驗證也是必須的。
多層次安全,嚴格檢查
除了參數(shù)化和輸入驗證之外,開發(fā)人員還應考慮使用對象關系映射( ORM ) 層來防止注入。這將數(shù)據(jù)從數(shù)據(jù)庫轉換為對象,反之亦然,從而減少了顯式SQL查詢降低SQL注入攻擊的風險。但是需要注意的是,如果使用錯誤或過時的Sequelize或 Hibernate版本,ORM庫中仍然會出現(xiàn)漏洞,因此開發(fā)人員必須保持警惕。
最終,也是需要重視的一點是,無論部署什么安全策略,都必須有一個嚴格的審查系統(tǒng)來審查代碼并標記發(fā)現(xiàn)的漏洞。為了確保較高的安全性,開發(fā)人員應該使用安全可控的專業(yè)靜態(tài)代碼掃描工具來自動檢查SQL注入漏洞并顯示出代碼中的缺陷問題。
SQL注入攻擊是一種危險的網(wǎng)絡威脅,好在可以防御。通過嚴格的靜態(tài)代碼檢測查找漏洞并修復,可以有效提高代碼質量從而加強軟件安全,進而阻止注入攻擊。隨著網(wǎng)絡犯罪與數(shù)字化同步增長,開發(fā)人員將安全性寫入代碼的核心觀念,比以往任何時候都更加重要。
參讀鏈接:
https://www.helpnetsecurity.com/2021/09/08/preventing-sql-injection-attacks/
