摘 要:網站的安全一直是管理員最為關注的問題,SQL注入是目前比較常見的針對網站數據庫的一種攻擊方式。本文對SQL注入攻擊的原理和種類以及如何防范進行了分析研究。
關鍵詞:SQL注入;攻擊;防范;數據庫
中圖分類號:TP393.08 文獻標識碼:A 文章編號:1674-7712 (2014) 22-0000-01
SQL注入(SQL Injection)是目前比較常見的針對網站數據庫的一種攻擊方式,大多數網站所遭受的攻擊都是SQL注入攻擊。其中絕大部分的攻擊是可以避免的,不過由于人為疏忽,造成許多網站被攻擊,敏感信息被泄露,給網站及其用戶都造成了負面影響和損失。因此,有必要梳理一下SQL注入攻擊的原理和種類,以期于網站的管理人員和WEB程序設計人員有所幫助。
一、什么是SQL注入攻擊
1999年國外出現SQL注入,2002年后我國開始大量出現,目前沒有標準定義。簡單地說,SQL注入攻擊就是利用網站程序代碼漏洞,巧妙構造惡意SQL語句,欺騙數據庫服務器非法獲取網站后臺數據庫的訪問權限和數據的攻擊行為。
二、SQL注入攻擊的主要種類及原理
鑒于SQL注入攻擊的危害性,有必要清楚其攻擊原理和主要種類。
(一)未對用戶輸入進行過濾。若未對用戶輸入中的單引號、連字符和分號等特殊符號進行過濾,攻擊者就可以將惡意代碼注入到SQL語句中以修改其含義。例如:statement:=\"SELECT*FROM users WHERE name='\"+userName+\"';\"。
該語句的編寫目的是從用戶表中查詢出一特定用戶信息,但若被惡意改裝,其功能可能就不是程序員所期望的了。假如攻擊者在輸入用戶變量userName時,輸入以下內容:a';DROP TABLE users; SELECT*FROM data WHERE name LIKE'%。
SQL語句就變成了:
SELECT*FROM users WHERE name='a';DROP TABLE users;SELECT * FROM data WHERE name LIKE'%';
這將會導致users表被刪除,并從data表中查詢出所有數據,實際上就是泄露了每一位用戶的信息。
(二)未對用戶輸入進行檢查驗證。若程序沒有對用戶輸入的合法性(如數據類型、長度、格式和范圍等)進行檢查驗證,也極易發生注入攻擊。例如:
statement:=\"SELECT*FROM data WHERE id=\"+a_variable+\";\"
程序員希望a_variable是一個與id字段有關的數字,但假如攻擊者在輸入變量a_variable時,輸入:
1;DROP TABLE users
則SQL語句就變成了:SELECT*FROM data WHERE id=1;DROP TABLE users;
同樣會將users表從數據庫中刪除。
三、SQL注入攻擊的防范
(一)對用戶輸入進行過濾。對于動態構造的SQL查詢,要防SQL注入,用戶的輸入就絕對不能直接被嵌入到SQL語句中,必須對輸入中的單引號、連字符和分號等特殊符號進行過濾,防止攻擊者篡改SQL語句。也可利用存儲過程實現對用戶輸入的過濾,拒絕一些特殊符號。
(二)使用參數化語句。使用參數來傳遞用戶輸入的內容而不是將用戶輸入直接嵌入到語句中,可防止攻擊者利用單引號和連字符實施攻擊。SQL Server數據庫提供的Parameters集合會將用戶輸入的內容視為普通的字符而不是可執行代碼,即使用戶輸入的內容中含有可執行代碼,數據庫也會濾掉。
(三)加強對用戶輸入的檢查驗證。通過檢查數據類型、長度、格式和范圍來驗證用戶輸入的合法性,確信輸入的內容只包含合法的數據,這是防止SQL注入攻擊的常見并且行之有效的方法。檢查用戶輸入,應當在客戶端和服務器端都執行。之所以要執行服務器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。在客戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然后將非法內容通過修改后的表單提交給服務器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在服務器端也執行驗證。
(四)使用專業的漏洞掃描工具。使用專業的漏洞掃描工具,可以幫助管理員發現可能被SQL注入攻擊的漏洞,并提醒管理員采取積極的措施來預防SQL注入式攻擊。
(五)嚴格區分普通用戶與系統管理員用戶的權限。在權限設計中,隔離不同帳戶可執行的操作,即用不同的用戶執行查詢、插入、更新、刪除操作。對于用來執行查詢的普通用戶,限制其數據庫對象的建立、刪除等權限。這樣即使普通用戶在SQL語句中注入了的惡意代碼,由于權限限制,這些代碼也將無法被執行,因而也就防止了原本用于執行SELECT命令的地方卻被用于執行INSERT、UPDATE或DELETE命令。
(六)加密用戶登錄名稱和密碼。在數據庫中將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然后再將它與數據庫中保存的數據比較,這相當于對用戶輸入的數據進行了“消毒”,這樣用戶輸入的數據不再對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
四、結束語
本文給出了SQL注入攻擊的基本概念,分析了SQL注入攻擊的基本原理和常見的攻擊方式,并提出了一些有針對性的防范措施,希望能對網站的管理人員和WEB程序設計人員提供一定的借鑒。
參考文獻:
[1]袁志.SQL注入的常見攻擊方法及其防范[J].電腦知識與技術,2010(23).
[2]梁玲.SQL注入攻擊與防范研究.電腦開發與應用[J].2009(12):68-71.
[作者簡介]鄭國旺(1974-),男,信息工程系副教授,工程師,電子商務師,軟件工程碩士,研究方向:電子商務和軟件工程。