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