10秒后自動(dòng)關(guān)閉
如何徹底防SQL注入(防SQL注入攻擊的幾種方式及優(yōu)劣對(duì)比分析)

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ù)

(圖一:SQL注入防護(hù))


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

 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)不可摧!