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

SQL注入漏洞是網(wǎng)站安全防護(hù)中最常見的漏洞之一,也是黑客最喜歡的攻擊途徑,因?yàn)榘l(fā)起SQL注入攻擊非常簡(jiǎn)單,使用注入攻擊工具就可以輕松實(shí)施入侵,但防范SQL注入攻擊卻非常困難。


首先我們來了解一下什么是SQL注入。

我們以后臺(tái)登錄功能為例,在數(shù)據(jù)庫查詢時(shí),一般使用如下SQL代碼:

select * from [users] where username='用戶名' and password='密碼'


如果用戶名填寫admin,密碼填寫:123456,完整的SQL語句就是:

select * from [users] where username='admin' and password='123456'


如果有返回結(jié)果,表示賬戶和密碼是正確的?雌饋硎菦]問題,但如果簡(jiǎn)單改一下,把密碼改為:123' or  'a'='a'

完整的SQL語句就成了:

select * from [users] where username='admin' and password='123' or 'a'='a'


很顯然a=a是成立的,數(shù)據(jù)庫就會(huì)返回記錄,黑客也就成功進(jìn)入系統(tǒng)了。



那么如何徹底防護(hù)SQL注入攻擊呢?

嚴(yán)格講,沒有徹底防護(hù)一說,因?yàn)槁┒礋o止境,唯有盡可能的提升防護(hù)能力。


護(hù)衛(wèi)神安全團(tuán)隊(duì)一共整理了三種防護(hù)方法:

1、 在每個(gè)頁面對(duì)查詢參數(shù)進(jìn)行SQL注入過濾

2、 在網(wǎng)站全局對(duì)輸入?yún)?shù)進(jìn)行SQL注入過濾

3、 在服務(wù)器對(duì)輸入?yún)?shù)進(jìn)行SQL注入過濾



一、 在每個(gè)頁面對(duì)查詢參數(shù)進(jìn)行SQL注入過濾

這種方法是防護(hù)SQL注入最常用的方法,是最有效的方法,但也是最讓人無賴的方法,因?yàn)槌霈F(xiàn)SQL注入漏洞的原因就是此種方法過濾不全面引發(fā)的。


例如上文的username和password,如果我們將password參數(shù)的單引號(hào)、雙引號(hào)、空格替換為空,完整的SQL語句變?yōu)椋?/p>

select * from [users] where username='admin' and password='123ora=a'

此時(shí)就無法登錄系統(tǒng)了,成功解決注入問題。

我們除了對(duì)password參數(shù)過濾,還需要對(duì)username參數(shù)進(jìn)行過濾,即:在SQL查詢語句中的所有參數(shù),都需要進(jìn)行過濾。


建議過濾掉的字符:' " ( ) * [ ] > <  % 空格 Tab鍵


此方法優(yōu)點(diǎn):效果好、無副作用

此方法缺點(diǎn):需要會(huì)玩代碼、改動(dòng)地方非常多

防護(hù)范圍:當(dāng)前參數(shù)



二、 在網(wǎng)站全局對(duì)輸入?yún)?shù)進(jìn)行SQL注入過濾

防護(hù)原理:建立一個(gè)公共頁面,讓每個(gè)腳本文件都include這個(gè)頁面。在這個(gè)公共頁面中,對(duì)輸入服務(wù)器的參數(shù)進(jìn)行危險(xiǎn)SQL關(guān)鍵詞檢測(cè),發(fā)現(xiàn)有危險(xiǎn)關(guān)鍵詞,就阻止訪問。示例代碼如下:

<%
' 函數(shù):檢查參數(shù)中是否包含危險(xiǎn)SQL語句
Function ChkSQL(inputString)
    if instr(inputString,"select")>0 then ChkSQL=1
    if instr(inputString,"update")>0 then ChkSQL=1
    '其他需要過濾的危險(xiǎn)SQL語句
    '...
    '...
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)操作,已阻止訪問!<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)操作,已阻止訪問!<br>"
        Response.End
    End If
Next
%>


此方法優(yōu)點(diǎn):改動(dòng)沒那么大

此方法缺點(diǎn):需要會(huì)玩代碼、副作用較大

防護(hù)范圍:include公共腳本的所有頁面



三、 在服務(wù)器對(duì)輸入?yún)?shù)進(jìn)行SQL注入過濾

防護(hù)原理和方法二想同,都是對(duì)輸入數(shù)據(jù)進(jìn)行過濾,不同點(diǎn)在于此方法無需更改代碼,非常適合不會(huì)玩代碼的人使用,同時(shí)副作用要遠(yuǎn)小于方法二。不過必須使用相關(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):效果好、無需改代碼、副作用小

此方法缺點(diǎn):可能要花錢

防護(hù)范圍:全服務(wù)器所有網(wǎng)站


上述三種方法,分別在不同層面,用不同方法對(duì)SQL注入攻擊進(jìn)行防護(hù),推薦使用“方法一+方法三”組合防護(hù),讓網(wǎng)站堅(jiān)不可摧!