SQL注入攻擊對企業安全形成巨大潛在威脅。一旦這種攻擊得逞,黑客可利用這種攻擊危害你的網絡并訪問破壞你的數據,甚至控制你的電腦。
什么是SQL注入?
SQL注入的原理十分簡單。當應用把客戶數據當作一種輸入的時候,那些心懷不軌的人就有機會注入刻意編寫的數據,這些數據會導致輸入行為會成為SQL查詢的一部分。
SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令,比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊。
當應用程序使用輸入內容來構造動態sql語句以訪問數據庫時,會發生sql注入攻擊。如果代碼使用存儲過程,而這些存儲過程作為包含未篩選的用戶輸入的字符串來傳遞,也會發生sql注入。sql注入可能導致攻擊者使用應用程序登陸在數據庫中執行命令。如果應用程序使用特權過高的帳戶連接到數據庫,這種問題會變得很嚴重。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態sql命令,或者作為存儲過程的輸入參數,這些表單特別容易受到sql注入的攻擊。而許多網站程序在編寫時,沒有對用戶輸入的合法性進行判斷或者程序中本身的變量處理不當,使應用程序存在安全隱患。這樣,用戶就可以提交一段數據庫查詢的代碼,根據程序返回的結果,獲得一些敏感的信息或者控制整個服務器,于是sql注入就發生了。
例如,以下列代碼為例:
SELECT * FROM Users WHERE Username='$username' AND Password='$password'
該代碼旨在展示用戶列表的用戶名和密碼記錄。使用Web界面,當系統提示輸入用戶名和密碼的時候,黑客可能會輸入:
1 or 1=1
1 or 1=1
結果是:
SELECT * FROM Users WHERE Username='1' OR '1' = '1' AND Password='1' OR '1' = '1'
黑客已經將OR條件成功注入驗證過程。更糟糕的是,條件'1' = '1'通常為真,因此這個SQL查詢往往會導致黑客繞過驗證過程。
用類似“;”的符號將另一個查詢附加到已有查詢之后(此附加查詢還對一部分已有查詢進行解釋)。黑客可能刪除你的整個列表,甚至更改其中的數據。黑客可以用命令來控制你的操作系統,從而操控你的電腦,并將之作為攻擊你其他網絡的一個中間站。總而言之,SQL注入攻擊可帶來以下后果:
數據私密性的喪失
數據完整性的喪失
數據泄漏
損害整個網絡
如何才能防止SQL注入攻擊呢?
要做到防微杜漸,最重要的是清理數據和驗證數據,這兩項工作不能出現懈怠。清理數據是指通過函數運行任何遞交的數據(如MySQL的mysql_real_escape_string()函數),以確保任何有威脅的字符,如“’”, 不會以數據方式輸入到SQL查詢。
驗證則有所不同。驗證是確保數據以被許可的方式遞交。在最基礎的操作中,驗證包括確保電子郵件地址包含@符號,當驗證只接受整數的時候,就只能提供數字,而且數據長度不能超過最大限度。驗證通常以兩種方式執行:一是列出危險字符或不受歡迎字符的黑名單;二是列出給定字符的名單,后者需要編程人員花費更多心思。雖然可以在客戶端驗證數據,但是黑客同樣能夠對數據進行修改,因此用戶有必要在服務器端驗證所有數據。
但是清理數據和驗證數據還遠遠不能保障用戶數據的安全。下面為大家介紹十種方法,幫助大家防止或減緩SQL注入攻擊:
1. 不信任任何人:假設所有用戶遞交的數據全部危險,對所有數據都進行驗證。
2. 沒必要的話,就不要使用動態SQL:包括使用過的預備陳述,參數化的查詢或保存好的進程。
3. 更新和補丁:通常程序和數據庫中都存在黑客可以通過SQL注入而利用的漏洞,因此非常有必要使用程序補丁和更新。
4. 防火墻:無論是基于軟件還是基于設備,都可考慮使用Web應用防火墻(WAF)來過濾惡意數據。好的防火墻具備一套完整的默認規則,而且很容易隨時添加新規則。一個WAF可以在新漏洞的相應補丁推出前,為用戶提供有效的安全保護。
5. 減少攻擊界面:及時對數據庫的功能進行處理,以免被黑客利用。例如,xp_cmdshell擴展了MS SQL中保存的進程,而這使得Windows命令窗口激增,并且還通過了一個用于執行的字符串,這些無疑都對黑客有益。被xp_cmdshell激增的Windows進程有著和SQL Server服務帳戶相同的優先安全權限。
6. 使用合適的權限:使用管理員級別權限的時候不要連接你的數據庫,除非迫不得已。使用有限的帳戶權限有利于數據安全,而且這樣也能限制黑客的權限。
7. 保密隱私:假設你的應用不安全,而且會隨加密操作或哈希密碼以及其他機密數據,包括連接字符串,作出相應調整。
8. 不要泄露過多信息:黑客可以從出錯信息中讀取大量有關數據庫架構的信息,因此要確保這些出錯信息中盡可能顯示比較少的信息。使用RemoteOnly CustomErrors模式在本地電腦上顯示冗長的錯誤信息,如此外部黑客的不良操作就只能收到無法操作的出錯信息。
9. 不要忘記根本原則:經常更改應用帳戶的密碼。雖然這是常識,但是實際生活中,很多人的密碼都是幾個月甚至幾年也難換一次。
10. 購買更好的軟件:在買下軟件前,就讓代碼編寫者先檢查代碼并修復客戶應用中的安全漏洞。