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