欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么解決nosql注入,如何解決sql注入問題

什么是sql注入如何防止sql注入

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 注入

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被注入

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

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)