SQL注入是一種非常常見的數(shù)據(jù)庫攻擊手段,同時(shí)也是網(wǎng)絡(luò)世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關(guān)鍵字的數(shù)據(jù)來使數(shù)據(jù)庫執(zhí)行非常規(guī)代碼的過程。

我們提供的服務(wù)有:做網(wǎng)站、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、潤州ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的潤州網(wǎng)站制作公司
問題來源是,SQL數(shù)據(jù)庫的操作是通過SQL語句來執(zhí)行的,而無論是執(zhí)行代碼還是數(shù)據(jù)項(xiàng)都必須寫在SQL語句中,也就導(dǎo)致如果我們在數(shù)據(jù)項(xiàng)中加入了某些SQL語句關(guān)鍵字,比如SELECT、DROP等,這些關(guān)鍵字就很有可能在數(shù)據(jù)庫寫入或讀取數(shù)據(jù)時(shí)得到執(zhí)行。
解決方案
方案一:
采用預(yù)編譯技術(shù)
使用預(yù)編譯的SQL語句,SQL語句的語義不會(huì)是不會(huì)發(fā)生改變的。預(yù)編譯語句在創(chuàng)建的時(shí)候就已經(jīng)將指定的SQL語句發(fā)送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結(jié)構(gòu),只是把值賦給?,然后將?這個(gè)變量傳給SQL語句。當(dāng)然還有一些通過預(yù)編譯繞過某些安全防護(hù)的操作,大家感興趣可以去搜索一下。
方案二:
嚴(yán)格控制數(shù)據(jù)類型
在java、c等強(qiáng)類型語言中一般是不存在數(shù)字型注入的,因?yàn)樵诮邮艿接脩糨斎雐d時(shí),代碼一般會(huì)做一個(gè)int id 的數(shù)據(jù)類型轉(zhuǎn)換,假如我們輸入的是字符串的話,那么這種情況下,程序就會(huì)報(bào)錯(cuò)。但是在PHP、ASP這些沒有強(qiáng)調(diào)處理數(shù)據(jù)類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字符進(jìn)行轉(zhuǎn)義
數(shù)字型注入可以通過檢查數(shù)據(jù)類型防止,但是字符型不可以,那么怎么辦呢,最好的辦法就是對特殊的字符進(jìn)行轉(zhuǎn)義了。比如在MySQL中我們可以對" '
"進(jìn)行轉(zhuǎn)義,這樣就防止了一些惡意攻擊者來閉合語句。當(dāng)然我們也可以通過一些安全函數(shù)來轉(zhuǎn)義特殊字符。如addslashes()等,但是這些函數(shù)并非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
SQL注入并不是一個(gè)在SQL內(nèi)不可解決的問題,這種攻擊方式的存在也不能完全歸咎于SQL這種語言,因?yàn)樽⑷氲膯栴}而放棄SQL這種方式也是因噎廢食。首先先說一個(gè)我在其他回答中也曾提到過的觀點(diǎn):沒有(運(yùn)行時(shí))編譯,就沒有注入。
SQL注入產(chǎn)生的原因,和棧溢出、XSS等很多其他的攻擊方法類似,就是未經(jīng)檢查或者未經(jīng)充分檢查的用戶輸入數(shù)據(jù),意外變成了代碼被執(zhí)行。針對于SQL注入,則是用戶提交的數(shù)據(jù),被數(shù)據(jù)庫系統(tǒng)編譯而產(chǎn)生了開發(fā)者預(yù)期之外的動(dòng)作。也就是,SQL注入是用戶輸入的數(shù)據(jù),在拼接SQL語句的過程中,超越了數(shù)據(jù)本身,成為了SQL語句查詢邏輯的一部分,然后這樣被拼接出來的SQL語句被數(shù)據(jù)庫執(zhí)行,產(chǎn)生了開發(fā)者預(yù)期之外的動(dòng)作。
所以從根本上防止上述類型攻擊的手段,還是避免數(shù)據(jù)變成代碼被執(zhí)行,時(shí)刻分清代碼和數(shù)據(jù)的界限。而具體到SQL注入來說,被執(zhí)行的惡意代碼是通過數(shù)據(jù)庫的SQL解釋引擎編譯得到的,所以只要避免用戶輸入的數(shù)據(jù)被數(shù)據(jù)庫系統(tǒng)編譯就可以了。
現(xiàn)在的數(shù)據(jù)庫系統(tǒng)都提供SQL語句的預(yù)編譯(prepare)和查詢參數(shù)綁定功能,在SQL語句中放置占位符'?',然后將帶有占位符的SQL語句傳給數(shù)據(jù)庫編譯,執(zhí)行的時(shí)候才將用戶輸入的數(shù)據(jù)作為執(zhí)行的參數(shù)傳給用戶。這樣的操作不僅使得SQL語句在書寫的時(shí)候不再需要拼接,看起來也更直接,而且用戶輸入的數(shù)據(jù)也沒有機(jī)會(huì)被送到數(shù)據(jù)庫的SQL解釋器被編譯執(zhí)行,也不會(huì)越權(quán)變成代碼。
至于為什么這種參數(shù)化的查詢方式?jīng)]有作為默認(rèn)的使用方式,我想除了兼容老系統(tǒng)以外,直接使用SQL確實(shí)方便并且也有確定的使用場合。
多說一點(diǎn),從代碼的角度來看,拼接SQL語句的做法也是不恰當(dāng)?shù)摹?/p>
在SQL查詢分析器執(zhí)行以下代碼就可以了。
declare
@t
varchar(255),@c
varchar(255)
declare
table_cursor
cursor
for
select
a.name,b.name
from
sysobjects
a,syscolumns
b
,systypes
c
where
a.id=b.id
and
a.xtype='u'
and
c.name
in
('char',
'nchar',
'nvarchar',
'varchar','text','ntext')
declare
@str
varchar(500),@str2
varchar(500)
set
@str='script
src=;/script'/*要替換的內(nèi)容*/
set
@str2=''
open
table_cursor
fetch
next
from
table_cursor
into
@t,@c
while(@@fetch_status=0)
begin
exec('update
['
+
@t
+
']
set
['
+
@c
+
']=replace(cast(['
+
@c
+
']
as
varchar(8000)),'''+@str+''','''+
@str2
+''')')
fetch
next
from
table_cursor
into
@t,@c
end
close
table_cursor
deallocate
table_cursor;
首先替換代碼里面的script
src=;/script為你的數(shù)據(jù)庫表里面被注入的內(nèi)容,打開MSSQL的SQL查詢分析器執(zhí)行以下代碼就可以了。
網(wǎng)站題目:怎么解決nosql注入,如何解決sql注入問題
URL分享:http://chinadenli.net/article38/dsejepp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、、建站公司、營銷型網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)