SQL注入漏洞是網(wǎng)站安全防護(hù)中最常見(jiàn)的漏洞之一,也是黑客最喜歡的攻擊途徑,因?yàn)榘l(fā)起SQL注入攻擊非常簡(jiǎn)單,使用注入攻擊工具就可以輕松實(shí)施入侵,但防范SQL注入攻擊卻非常困難。
首先我們來(lái)了解一下什么是SQL注入。
我們以后臺(tái)登錄功能為例,在數(shù)據(jù)庫(kù)查詢時(shí),一般使用如下SQL代碼:
select * from [users] where username='用戶名' and password='密碼'
如果用戶名填寫(xiě)admin,密碼填寫(xiě):123456,完整的SQL語(yǔ)句就是:
select * from [users] where username='admin' and password='123456'
如果有返回結(jié)果,表示賬戶和密碼是正確的?雌饋(lái)是沒(méi)問(wèn)題,但如果簡(jiǎn)單改一下,把密碼改為:123' or 'a'='a'
完整的SQL語(yǔ)句就成了:
select * from [users] where username='admin' and password='123' or 'a'='a'
很顯然a=a是成立的,數(shù)據(jù)庫(kù)就會(huì)返回記錄,黑客也就成功進(jìn)入系統(tǒng)了。
那么如何徹底防護(hù)SQL注入攻擊呢?
嚴(yán)格講,沒(méi)有徹底防護(hù)一說(shuō),因?yàn)槁┒礋o(wú)止境,唯有盡可能的提升防護(hù)能力。
護(hù)衛(wèi)神安全團(tuán)隊(duì)一共整理了三種防護(hù)方法:
1、 在每個(gè)頁(yè)面對(duì)查詢參數(shù)進(jìn)行SQL注入過(guò)濾
2、 在網(wǎng)站全局對(duì)輸入?yún)?shù)進(jìn)行SQL注入過(guò)濾
3、 在服務(wù)器對(duì)輸入?yún)?shù)進(jìn)行SQL注入過(guò)濾
一、 在每個(gè)頁(yè)面對(duì)查詢參數(shù)進(jìn)行SQL注入過(guò)濾
這種方法是防護(hù)SQL注入最常用的方法,是最有效的方法,但也是最讓人無(wú)賴的方法,因?yàn)槌霈F(xiàn)SQL注入漏洞的原因就是此種方法過(guò)濾不全面引發(fā)的。
例如上文的username和password,如果我們將password參數(shù)的單引號(hào)、雙引號(hào)、空格替換為空,完整的SQL語(yǔ)句變?yōu)椋?/p>
select * from [users] where username='admin' and password='123ora=a'
此時(shí)就無(wú)法登錄系統(tǒng)了,成功解決注入問(wèn)題。
我們除了對(duì)password參數(shù)過(guò)濾,還需要對(duì)username參數(shù)進(jìn)行過(guò)濾,即:在SQL查詢語(yǔ)句中的所有參數(shù),都需要進(jìn)行過(guò)濾。
建議過(guò)濾掉的字符:' " ( ) * [ ] > < % 空格 Tab鍵
此方法優(yōu)點(diǎn):效果好、無(wú)副作用
此方法缺點(diǎn):需要會(huì)玩代碼、改動(dòng)地方非常多
防護(hù)范圍:當(dāng)前參數(shù)
二、 在網(wǎng)站全局對(duì)輸入?yún)?shù)進(jìn)行SQL注入過(guò)濾
防護(hù)原理:建立一個(gè)公共頁(yè)面,讓每個(gè)腳本文件都include這個(gè)頁(yè)面。在這個(gè)公共頁(yè)面中,對(duì)輸入服務(wù)器的參數(shù)進(jìn)行危險(xiǎn)SQL關(guān)鍵詞檢測(cè),發(fā)現(xiàn)有危險(xiǎn)關(guān)鍵詞,就阻止訪問(wèn)。示例代碼如下:
<%
' 函數(shù):檢查參數(shù)中是否包含危險(xiǎn)SQL語(yǔ)句
Function ChkSQL(inputString)
if instr(inputString,"select")>0 then ChkSQL=1
if instr(inputString,"update")>0 then ChkSQL=1
'其他需要過(guò)濾的危險(xiǎn)SQL語(yǔ)句
'...
'...
End Function
' 檢查GET參數(shù)
Dim queryStringKey, queryStringValue
For Each queryStringKey In Request.QueryString
queryStringValue = Request.QueryString(queryStringKey)
If ChkSQL(queryStringValue)=1 Then
Response.Write "非常抱歉,你的請(qǐng)求涉嫌危險(xiǎn)操作,已阻止訪問(wèn)!<br>"
Response.End
End If
Next
' 檢查POST參數(shù)
Dim formKey, formValue
For Each formKey In Request.Form
formValue = Request.Form(formKey)
If ChkSQL(formValue) Then
Response.Write "非常抱歉,你的請(qǐng)求涉嫌危險(xiǎn)操作,已阻止訪問(wèn)!<br>"
Response.End
End If
Next
%>
此方法優(yōu)點(diǎn):改動(dòng)沒(méi)那么大
此方法缺點(diǎn):需要會(huì)玩代碼、副作用較大
防護(hù)范圍:include公共腳本的所有頁(yè)面
三、 在服務(wù)器對(duì)輸入?yún)?shù)進(jìn)行SQL注入過(guò)濾
防護(hù)原理和方法二想同,都是對(duì)輸入數(shù)據(jù)進(jìn)行過(guò)濾,不同點(diǎn)在于此方法無(wú)需更改代碼,非常適合不會(huì)玩代碼的人使用,同時(shí)副作用要遠(yuǎn)小于方法二。不過(guò)必須使用相關(guān)的防注入軟件,推薦使用《護(hù)衛(wèi)神.防入侵系統(tǒng)》,自帶SQL注入防護(hù)和XSS跨站攻擊防護(hù)(如下圖一)。

(圖一:SQL注入防護(hù))
只需要安裝上軟件,都不用任何設(shè)置,系統(tǒng)就自動(dòng)防護(hù)SQL注入,攔截效果如下圖二。

(圖二:SQL注入攔截效果)
此方法優(yōu)點(diǎn):效果好、無(wú)需改代碼、副作用小
此方法缺點(diǎn):可能要花錢(qián)
防護(hù)范圍:全服務(wù)器所有網(wǎng)站
上述三種方法,分別在不同層面,用不同方法對(duì)SQL注入攻擊進(jìn)行防護(hù),推薦使用“方法一+方法三”組合防護(hù),讓網(wǎng)站堅(jiān)不可摧!