• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于SQL注入的Web數(shù)據(jù)安全防范與優(yōu)化

      2014-04-29 00:44:03林世鑫
      電腦知識(shí)與技術(shù) 2014年10期
      關(guān)鍵詞:防范數(shù)據(jù)安全優(yōu)化

      林世鑫

      摘要:SQL注入利用數(shù)據(jù)庫(kù)系統(tǒng)的安全漏洞,以及程序中的驗(yàn)證漏洞,構(gòu)造合適的SQL語(yǔ)句,并通過(guò)正常的URL訪問(wèn)進(jìn)行代碼提交,獲取數(shù)據(jù)庫(kù)中的相關(guān)信息,從而實(shí)現(xiàn)網(wǎng)站攻擊的目的。加強(qiáng)用戶提交數(shù)據(jù)的合法性驗(yàn)證,是防止SQL注入的基本方法。而改善ASP中的Request函數(shù),使其具有對(duì)一切用戶數(shù)據(jù)進(jìn)行合法驗(yàn)證的能力,是SQL注入威脅下,Web數(shù)據(jù)安全防范方法的最佳優(yōu)化。

      關(guān)鍵詞:SQL注入;數(shù)據(jù)安全;防范;優(yōu)化

      中圖分類(lèi)號(hào):TP309.5 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)10-2184-04

      Abstract: Exploiting the security vulnerabilities of database system and validation vulnerabilities of the computer programs, SQL injection builds proper SQL statements, submit code by normal URL access and get relevant information from the database in order to achieve the goal of website attacks.It is the basic approach of preventing SQL injection to strengthen the legality verification while a user submits data. And under the SQL injection threat, it is the best optimization of web data safety precautions to improve the Request function of ASP so as to make it capable to verify the legality of all user data.

      Key words: SQL-injection; data security; precaution; optimization

      在當(dāng)前各類(lèi)網(wǎng)站建設(shè)或者基于Web平臺(tái)的軟件系統(tǒng)建設(shè)(以下統(tǒng)稱網(wǎng)站)中,由于從事開(kāi)發(fā)的人員的水平與經(jīng)驗(yàn),參差不齊,這就直接導(dǎo)致許多網(wǎng)站,都存在著一定程度上的安全隱患,給黑客的攻擊留有可趁之機(jī),嚴(yán)重威脅著網(wǎng)站的正常運(yùn)行。尤其是如果采用SQL注入進(jìn)行攻擊的話,由于該方法靈活多變,對(duì)網(wǎng)站的安全性具有更高的考驗(yàn)。并且,這種注入是通過(guò)WWW端口實(shí)現(xiàn)的,跟對(duì)網(wǎng)站的web頁(yè)面的正常訪問(wèn)是一樣的,因此,這種注入還能繞過(guò)許多防火墻的監(jiān)控,具有很強(qiáng)的隱蔽性。

      各種原因使然,國(guó)內(nèi)目前絕大部分的網(wǎng)站,都采用asp技術(shù),以Access或者SQL-Server為數(shù)據(jù)庫(kù)。因此,筆者以此為技術(shù)平臺(tái),分析SQL注入的安全威脅、防范對(duì)策以及深入的優(yōu)化策略。

      1 SQL注入的基本原理

      所謂SQL注入,是指利用網(wǎng)站程序?qū)τ脩糨斎霐?shù)據(jù)的合法性驗(yàn)證中存在的漏洞,構(gòu)造合適的SQL語(yǔ)句,并通過(guò)正常的URL訪問(wèn)提交此代碼,從而獲取并借肋網(wǎng)站數(shù)據(jù)庫(kù)中的相關(guān)信息,達(dá)到攻擊的目的。這種注入隨著攻擊者的SQL語(yǔ)句構(gòu)造能力愈強(qiáng),變化也愈巧妙,對(duì)網(wǎng)站的開(kāi)發(fā)者在數(shù)據(jù)安全防范方面的意識(shí)與能力,挑戰(zhàn)性也就愈強(qiáng)。

      SQL注入通常有以下四個(gè)特征:

      1)利用用戶輸入數(shù)據(jù)的合法性驗(yàn)證漏洞進(jìn)行突破。這與許多黑客攻擊直接利用服務(wù)器的安全漏洞進(jìn)行網(wǎng)站攻擊有本質(zhì)的不同。

      2)應(yīng)變性強(qiáng)。能夠根據(jù)不同的數(shù)據(jù)庫(kù)結(jié)構(gòu),構(gòu)造出不同的SQL語(yǔ)句,巧妙靈活;

      3)相關(guān)的攻擊代碼,通過(guò)Web端口,伴隨著正常的頁(yè)面訪問(wèn)進(jìn)行注入,不直接與防火墻或其它安全防范軟件進(jìn)行“硬接觸”。

      4)Access數(shù)據(jù)庫(kù)與Sql-server數(shù)據(jù)庫(kù)一個(gè)共同的特點(diǎn):如果參與運(yùn)算的數(shù)據(jù)的數(shù)據(jù)類(lèi)型不正確,就先嘗試進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換,如果轉(zhuǎn)換失敗,會(huì)返回一個(gè)錯(cuò)誤報(bào)告。SQL注入正是利用這個(gè)特點(diǎn),故意提交一些錯(cuò)誤類(lèi)型的數(shù)據(jù),“誘惑”數(shù)據(jù)庫(kù)自覺(jué)犯錯(cuò)并報(bào)錯(cuò),從而泄露了重要信息。這一點(diǎn),也是SQL注入最重要的特征。

      我們舉例實(shí)際分析一下SQL注入的基本原理。我們?cè)O(shè)定網(wǎng)站的測(cè)試服務(wù)器地址為:http://127.0.0.1,測(cè)試的URL為:http://127.0.0.1/art_detail.asp?id=8。

      通過(guò)瀏覽器的地址欄輸入以上URL,并在最后加上一個(gè)單引號(hào),使其成為http://127.0.0.1/art_detail.asp?id=8,然后再次訪問(wèn)。這時(shí),如果服務(wù)器在瀏覽器中返回以下信息:

      Microsoft JET Database Engine 錯(cuò)誤 '80040e14'

      字符串的語(yǔ)法錯(cuò)誤 在查詢表達(dá)式 'ID=8'' 中。

      /art_detail.asp,行9

      那么,根據(jù)這個(gè)返回的錯(cuò)誤信息就可以作出以下判斷:

      1)該網(wǎng)站存在SQL注入的安全漏洞,這是最基本的判斷;

      2)該網(wǎng)站的數(shù)據(jù)庫(kù)是MS-Access,并且連接數(shù)據(jù)庫(kù)的引擎是JET;

      3)該頁(yè)面使用的數(shù)據(jù)表中,有一個(gè)字段的名稱是ID;

      由此可見(jiàn),如果網(wǎng)站程序?qū)τ脩舻妮斎胄畔](méi)有嚴(yán)格的合法性驗(yàn)證的話,僅在一個(gè)URL后附加一個(gè)簡(jiǎn)單的符號(hào),就可能試探出許多服務(wù)器及數(shù)據(jù)庫(kù)中的信息,獲取需要的資料。這就是SQL注入的基本原理。

      2 Access數(shù)據(jù)庫(kù)的SQL注入與防范對(duì)策

      ACCESS數(shù)據(jù)庫(kù)盡管存在著各種各樣的安全漏洞,但是由于其方便、靈活的性能以及目前國(guó)內(nèi)網(wǎng)站的實(shí)際需要,許多網(wǎng)站,依然是采用Access作為數(shù)據(jù)庫(kù)。而針對(duì)Access數(shù)據(jù)庫(kù),利用SQL注入進(jìn)行網(wǎng)站攻擊的方法,主要有單引號(hào)探測(cè)法與1=1,1=2探測(cè)法兩種。這兩種方法基本都是利用了數(shù)據(jù)庫(kù)對(duì)錯(cuò)誤數(shù)據(jù)類(lèi)型的數(shù)據(jù)進(jìn)行運(yùn)算時(shí),有自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型的特點(diǎn),因此,在數(shù)據(jù)安全防范對(duì)策上,也主要是從阻止這種自動(dòng)轉(zhuǎn)換出發(fā)。

      2.1 單引號(hào)探測(cè)法

      無(wú)論是哪一種SQL注入方法,尋找注入點(diǎn)都是第一點(diǎn)。因此,在防范策略上也主要是從注入點(diǎn)著手,把存在的注入點(diǎn)都消除了,也就意味著堵住了SQL注入的唯一途徑。

      在眾多的注入點(diǎn)探測(cè)法中,單引號(hào)探測(cè)法是比較基本、簡(jiǎn)單的一種方法。其操作方法就是在帶有訪問(wèn)參數(shù)的網(wǎng)址后面,附加一個(gè)單引號(hào)提交給服務(wù)器,再?gòu)姆?wù)器返回的錯(cuò)誤信息中,分析、獲取需要的資料,然后決定如何構(gòu)造進(jìn)一步的注入語(yǔ)句。它主要利用的漏洞就是程序員在驗(yàn)證用戶輸入數(shù)據(jù)時(shí),沒(méi)有過(guò)濾掉特殊字符。因?yàn)樵趲в性L問(wèn)參數(shù)的網(wǎng)址中,如http://127.0.0.1/art_detail.asp?id=8,當(dāng)程序收到這串URL時(shí),它必定向數(shù)據(jù)庫(kù)進(jìn)行一個(gè)ID=8的查詢操作,比如有可能是:

      Dim v_id

      V_id=request.querystring “id”

      Sqlstr=”select * from #table_name where id=”&v_id

      ……

      在大多數(shù)情況下,ID字段的數(shù)據(jù)類(lèi)型是“數(shù)字型”或“數(shù)值型”。如果攻擊者在后面附加一個(gè)單引號(hào),變成ID=8,后面的“8”就不再是“數(shù)字”或“數(shù)值”,而是“字符串”了。在這種情況下,數(shù)據(jù)庫(kù)就會(huì)嘗試把這個(gè)“字符串型”轉(zhuǎn)換成“數(shù)值型”,當(dāng)然,這樣的的轉(zhuǎn)換一定會(huì)失敗,相關(guān)的查詢也就沒(méi)辦法完成。于是,服務(wù)器便會(huì)向客戶端的瀏覽器返回以下信息:

      Microsoft JET Database Engine 錯(cuò)誤 '80040e14'

      字符串的語(yǔ)法錯(cuò)誤 在查詢表達(dá)式 'ID=8'' 中。

      /art_detail.asp,行9

      這就是上文所述的情況了。

      當(dāng)然,對(duì)這種情況,我們的防范措施也是比較簡(jiǎn)單有且有效的。

      第一種方法是對(duì)用戶端提交來(lái)的數(shù)據(jù),在程序上先進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換,避免直接交給數(shù)據(jù)庫(kù)進(jìn)行轉(zhuǎn)換。如:

      V_id=request.querystring “id”

      改為:

      V_id=Cint(request.querystring “id”)

      這樣,如果提交上來(lái)的ID值,不是“數(shù)值型”的話,就在執(zhí)行這個(gè)語(yǔ)句時(shí),直接報(bào)錯(cuò),而不再把數(shù)據(jù)提交給數(shù)據(jù)庫(kù),從而避免由于數(shù)據(jù)庫(kù)處理時(shí)報(bào)錯(cuò)而泄露相關(guān)信息。

      第二種方法是采用過(guò)濾法,對(duì)用戶提交上來(lái)的數(shù)據(jù)中,可能存在的特殊字符,先過(guò)濾掉,再提交給數(shù)據(jù)庫(kù)進(jìn)行下一步的操作。例如定義一個(gè)過(guò)濾函數(shù)如下:

      <%

      Function ReplaceBadWord(g_word)

      g_word=Replace(g_word,"'","")

      g_word=Replace(g_word," ","")

      g_word=Replace(g_word,"&","")

      g_word=Replace(g_word,"(","")

      g_word=Replace(g_word,"\","")

      g_word=Replace(g_word,"/","")

      g_word=Replace(g_word,"..","")

      g_word=Replace(g_word,"^","")

      g_word=Replace(g_word,"#","")

      g_word=Replace(g_word,"%","")

      g_word=Replace(g_word,"|","")

      g_word=Replace(g_word,";","")

      g_word=Trim(Replace(g_word,")",""))

      ReplaceBadWord=g_word

      End Function

      %>

      然后,對(duì)用戶提交上來(lái)的數(shù)據(jù),先執(zhí)行一下過(guò)濾操作:

      V_id= (ReplaceBadWord(request.querystring("id"))

      這樣,就可以使用戶數(shù)據(jù)中存在的特殊字符,在進(jìn)行數(shù)據(jù)庫(kù)查詢之前,全部過(guò)濾掉。強(qiáng)制性地將不合法的數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為合法類(lèi)型。

      2.2 1=1與1=2探測(cè)法

      1=1與1=2探測(cè)法是ACCESS平臺(tái)中另一種比較常見(jiàn)的注入點(diǎn)試探法。盡管在SQL-SERVER數(shù)據(jù)庫(kù)平臺(tái)中,這種方法也依然適用,但由于在SQL—SERVER平臺(tái)中,有另一種更高效的探測(cè)法,因此,這種方法,主要針對(duì)ACCESS平臺(tái)使用。

      該法的試探語(yǔ)句如下:

      http://127.0.0.1/art_detail.asp?id=8;and 1=1

      http://127.0.0.1/art_detail.asp?id=8;and 1=2

      提交訪問(wèn)以后,無(wú)論是添加了1=1還是1=2,只要瀏覽器中返回的結(jié)果跟正常URL是一樣的,或者雖然不一樣,但并沒(méi)有返回一個(gè)由程序員自定義的錯(cuò)誤信息,那么,就可以判定這個(gè)網(wǎng)站是存在安全漏洞的,可以通過(guò)構(gòu)造SQL語(yǔ)句,進(jìn)行注入。

      這是利用了運(yùn)算符的運(yùn)算優(yōu)先級(jí)不同而構(gòu)造的SQL注入語(yǔ)句。因?yàn)?=1的結(jié)果是true,而1=2的結(jié)果是false。再運(yùn)行下一級(jí)運(yùn)算時(shí),就是id=8 and true,id=8 and false。最后,這兩個(gè)URL就變成了:

      http://127.0.0.1/art_detail.asp?id=true

      http://127.0.0.1/art_detail.asp?id=false

      至此,我們已經(jīng)可以看到,這種探測(cè)法實(shí)際上還是利用了數(shù)據(jù)庫(kù)在操作時(shí),如果參與操作的數(shù)據(jù)類(lèi)型錯(cuò)誤,就自動(dòng)轉(zhuǎn)換類(lèi)據(jù)類(lèi)型,如果轉(zhuǎn)換出錯(cuò),就返回報(bào)錯(cuò)信息的原理。因此,在防范對(duì)策上,我們依然是在信息提交到數(shù)據(jù)庫(kù)之前,先由程序進(jìn)行數(shù)據(jù)類(lèi)型的強(qiáng)制轉(zhuǎn)換,即使轉(zhuǎn)換出錯(cuò),也只向客戶端返回程序錯(cuò)誤報(bào)告,而不會(huì)返回?cái)?shù)據(jù)庫(kù)錯(cuò)誤報(bào)告。數(shù)據(jù)庫(kù)的相關(guān)信息資料,也就不會(huì)隨著錯(cuò)誤報(bào)告泄露。

      3 MS Sql-server數(shù)據(jù)庫(kù)的SQL注入威脅與防范

      對(duì)于ACCESS平臺(tái)適用的注入點(diǎn)探測(cè)法,基本也適用于SQL-server。但是,由于SQL-server數(shù)據(jù)庫(kù)管理系統(tǒng)具有更嚴(yán)謹(jǐn)、更復(fù)雜的系統(tǒng)性能,因此,也給網(wǎng)站攻擊者留下有別于Access的注入漏洞。特別是在服務(wù)器的IIS提示沒(méi)有關(guān)閉的情況下,Sql-server中的一些系統(tǒng)變量中的信息,更是網(wǎng)站數(shù)據(jù)安全的最大隱患。

      3.1 user>0探測(cè)法

      該探測(cè)法就是利用了Sql-server中的一個(gè)系統(tǒng)變量user中的信息,通過(guò)構(gòu)造一個(gè)錯(cuò)誤的SQL語(yǔ)句,“誘惑”數(shù)據(jù)庫(kù)系統(tǒng)不自覺(jué)地泄露重要數(shù)據(jù)。

      user在MS Sql-server數(shù)據(jù)庫(kù)系統(tǒng)中,是一個(gè)重要的系統(tǒng)變量,類(lèi)型是可變長(zhǎng)度 Unicode (nvarchar),保存的是當(dāng)前連接數(shù)據(jù)庫(kù)的用戶名。當(dāng)然,通常情況下,攻擊者是不知道這個(gè)用戶名的。但是在user>0探測(cè)法,卻是比較容易破解的。只要把正常訪問(wèn)URL改為:http://127.0.0.1/art_detail.asp?id=8;and user>0

      這個(gè)URL分號(hào)之前的內(nèi)容,是正確的。但是當(dāng)服務(wù)器遇到user>0這段語(yǔ)句,而數(shù)據(jù)庫(kù)又恰好是Sql-server時(shí),這就相當(dāng)于用一個(gè)nvarchar類(lèi)型的數(shù)據(jù)與一個(gè)int類(lèi)型的數(shù)據(jù),進(jìn)行比較運(yùn)算。系統(tǒng)就會(huì)嘗試把user中的數(shù)值轉(zhuǎn)換成int型,由于絕大多數(shù)情況下,user中保存的數(shù)據(jù)都不會(huì)是純數(shù)字,因此,這種轉(zhuǎn)換是失敗的。于是,Sql-server就會(huì)把錯(cuò)誤報(bào)告返回到客戶端:將nvarchar值 “l(fā)sx” 轉(zhuǎn)換數(shù)據(jù)類(lèi)型為 int時(shí)發(fā)生語(yǔ)法錯(cuò)誤!

      “l(fā)sx”就是系統(tǒng)變量user的值了,也就是當(dāng)前數(shù)據(jù)庫(kù)的用戶名。如果返回信息中,這個(gè)值是“dbo”的話,那安全隱患就更大。因?yàn)檫@說(shuō)明該網(wǎng)站的數(shù)據(jù)庫(kù)是用sa這個(gè)用戶登陸連接的。而sa的是一個(gè)幾乎與Administrator具有同樣權(quán)限的用戶。

      解決這個(gè)安全隱患的方法有兩種。一是在構(gòu)建網(wǎng)站的服務(wù)器時(shí),把IIS提示關(guān)閉,這樣即使是產(chǎn)生了數(shù)據(jù)庫(kù)層面的錯(cuò)誤,也不會(huì)向客戶端返回相關(guān)的報(bào)告。方法二還是回到數(shù)據(jù)的合法性驗(yàn)證上,構(gòu)造合適驗(yàn)證函數(shù),對(duì)提交上來(lái)的相關(guān)信息,進(jìn)行驗(yàn)證或轉(zhuǎn)換,避免沒(méi)有任何的檢查就直接向數(shù)據(jù)庫(kù)提交。

      3.2 系統(tǒng)表探測(cè)法

      如果通過(guò)3.1中的方法,成功探測(cè)到數(shù)據(jù)庫(kù)是用“sa”用戶登陸的話,那么,再利用系統(tǒng)表的探測(cè)法,依托Sql-server與操作系統(tǒng)之間的各種聯(lián)系依賴,就幾乎可以全面突破網(wǎng)站的數(shù)據(jù)安全防線。

      在Sql-server系統(tǒng)中,有一張名為sysobjects的系統(tǒng)表,數(shù)據(jù)庫(kù)中的表名、視圖、約束及其它對(duì)象都存儲(chǔ)在該表中。并且在web環(huán)境下,這張表是具有可讀權(quán)限的。

      那么,經(jīng)過(guò)以下注入步驟,攻擊者就可以將網(wǎng)站的數(shù)據(jù)全部獲取。

      1)http://127.0.0.1/art_detail.asp?id=7;exec master..xp_cmdshell “net user new_user new_pw /add”

      在Sql-server系統(tǒng)中,分號(hào)的作用是劃分語(yǔ)句。因此,系統(tǒng)會(huì)將從數(shù)據(jù)庫(kù)中查詢出id=7的記錄。然后,通過(guò)存儲(chǔ)過(guò)程xp_cmdshell調(diào)用系統(tǒng)命令net,給操作系統(tǒng)加一個(gè)名稱為new_user,密碼為new_pw的系統(tǒng)用戶。

      2)http://127.0.0.1/art_detail.asp?id=7;exec master..xp_cmdshell “net localgroup new_user administrators /add”

      這段代碼一旦注入成功,就意味著剛才新添加的new_user用戶被攻擊者添加到了數(shù)據(jù)庫(kù)的管理員組,即具備了管理數(shù)據(jù)庫(kù)的一切權(quán)限。

      3)http://127.0.0.1/art_detail.asp?id=1 ;and db_name()>0

      這里又一次利用了系統(tǒng)變量db_name(),這個(gè)變量中保存的是網(wǎng)站連接的數(shù)據(jù)庫(kù)名稱。因?yàn)檫@個(gè)名稱是字符串型的,而代碼中的>0是一種比較運(yùn)算,于是,系統(tǒng)就會(huì)被“誘惑”將系統(tǒng)變量中的值先轉(zhuǎn)成整型,這種轉(zhuǎn)換必定會(huì)失敗,并將錯(cuò)誤的信息返回給客戶端。而當(dāng)中所保存的數(shù)據(jù)庫(kù)名,就隨著這些信息一起顯示在瀏覽器中。

      數(shù)據(jù)庫(kù)的名稱都已經(jīng)暴露了,如果注入者再探出數(shù)據(jù)庫(kù)的路徑的話,網(wǎng)站數(shù)據(jù)庫(kù)就是毫無(wú)安全可言了。即將沒(méi)有辦法探出數(shù)據(jù)庫(kù)的路徑,依然可以通過(guò)以下步驟,不斷地構(gòu)造錯(cuò)誤的SQL代碼,誘惑系統(tǒng)自行暴露相關(guān)的數(shù)據(jù)。

      1)http://127.0.0.1/art_detail.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=U and status>0)>0

      xtype=U and status>0,表示用戶建立的表名。用(四)中的語(yǔ)句,把sysobjects系統(tǒng)表中保存的第一張數(shù)據(jù)表名與0進(jìn)行相比較,誘惑數(shù)據(jù)庫(kù)系統(tǒng)出錯(cuò)、報(bào)錯(cuò),返回正確的數(shù)據(jù)表名。當(dāng)然,同樣的方法,其他數(shù)據(jù)表名也都不難試探出來(lái),只要把Top 1把為2,3……即可。

      2)http://127.0.0.1/art_detail.asp?id=1 ;and (Select Top 1 col_name(object_id(‘t_name),1) from sysobjects)>0

      知道了數(shù)據(jù)表的名稱,就可以用上面的代碼探得該表中的字段名。object_id(‘t_name)返回該表名對(duì)應(yīng)的內(nèi)部ID。col_name(t_name ID,1)即返回t_name表中第一個(gè)字段的名稱,把1改為2,就是第二個(gè)字段名,依此類(lèi)推。

      至此,我們可見(jiàn),如果防范措施不當(dāng),系統(tǒng)表有時(shí)簡(jiǎn)直就是數(shù)據(jù)安全最大的威脅,只要稍作“誘惑”,就會(huì)把網(wǎng)站的數(shù)據(jù)全盤(pán)托出。

      4 防止SQL注入的防范優(yōu)化

      無(wú)論是Access還是Sql-server,也無(wú)論是哪一種SQL注入點(diǎn)探測(cè)法,其實(shí)都是利用了用戶提交的數(shù)據(jù)在驗(yàn)證中不嚴(yán)謹(jǐn)?shù)穆┒?。但是,?jiǎn)單地采用前面所提及的特殊字符替換、驗(yàn)證方法,也并非絕對(duì)安全,因?yàn)樽⑷胝哌€可以通過(guò)一些字符轉(zhuǎn)換函數(shù),將特殊字符函數(shù)化以后,混在URL中提交,例如在ASCII編碼中,35是#對(duì)應(yīng)的數(shù)值,那么用chr(35)函數(shù),替代#號(hào),就繞過(guò)了程序中的特殊字符驗(yàn)證。

      因此,還必須有更高的安全防范優(yōu)化方法。具體的優(yōu)化方法可以有以下兩種:

      1)重要的數(shù)據(jù),采用加密法存儲(chǔ)。如用戶表中的個(gè)人信息,盡可能采用MD5加密法加密后保存, 這樣,即使被試出相關(guān)信息,返回的,也都是加密后的數(shù)據(jù),而MD5是不可逆的。這種方法,主要是杜絕攻擊者獲取網(wǎng)站的用戶信息,從而造成破壞。

      2)SQL注入點(diǎn)探測(cè)方法之所以能夠成功,最根本的原因在于ASP中Request函數(shù)的安全漏洞。因?yàn)檫@個(gè)函數(shù)只負(fù)責(zé)獲取客戶端提交上來(lái)的數(shù)據(jù),對(duì)數(shù)據(jù)的合法性卻無(wú)法判別,而注入者可能構(gòu)造出來(lái)的SQL語(yǔ)句又是變化多樣,程序員很難在編寫(xiě)驗(yàn)證程序時(shí),考慮到每一種情況,這就導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)會(huì)被注入語(yǔ)句的“故意性數(shù)據(jù)類(lèi)型錯(cuò)誤”誘惑,自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型,并報(bào)錯(cuò),從而泄露了重要信息。因此,改造Request函數(shù),提高其安全性能,保證才是杜絕SQL注入的最根本之法。

      改造優(yōu)化以后的Request函數(shù)如下:

      Function My_Request(Cs_Name,Cs_DataType)

      ' Cs_Name:參數(shù)名稱-字符型

      ' Cs_DataType:參數(shù)的數(shù)據(jù)類(lèi)型-數(shù)字型(1表示Cs_Name是數(shù)字,0表示Cs_Name是字符)

      Dim CS_Value

      CS_Value =Request(Cs_Name)

      If Cs_DataType =1 then

      If not isNumeric(CS_Value) then

      Response.write "所提交的數(shù)據(jù)" & Cs_Name & "必須為數(shù)字型!"

      Response.end

      End if

      Else

      CS_Value =replace(CS_Value,"'","''")

      End if

      My_Request = CS_Value

      End function

      通過(guò)調(diào)用這個(gè)函數(shù),我們可以對(duì)用戶提交的一切數(shù)據(jù)在提交階段就進(jìn)行驗(yàn)證,只要提交到服務(wù)器的數(shù)據(jù)與其必須對(duì)應(yīng)的數(shù)據(jù)類(lèi)型不一致,就在返回程序中的錯(cuò)誤報(bào)告,而不再向數(shù)據(jù)庫(kù)提交任何操作請(qǐng)求,從而把一切SQL注入點(diǎn)的試探拒之于數(shù)據(jù)庫(kù)門(mén)外。

      5 結(jié)束語(yǔ)

      加強(qiáng)網(wǎng)站數(shù)據(jù)安全的保護(hù)與防范,是所有網(wǎng)站程序員必須面對(duì)的問(wèn)題。在Access或者 Sql-server數(shù)據(jù)庫(kù)中,SQL注入最有利條件的就是這兩種數(shù)據(jù)庫(kù)系統(tǒng)都會(huì)對(duì)運(yùn)算操作中,自動(dòng)把錯(cuò)誤的數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換失敗以后,向客戶端返回錯(cuò)誤報(bào)告。因此,要阻止這種威脅,就必須保證數(shù)據(jù)庫(kù)系統(tǒng)接收到的操作數(shù)據(jù),都是合法正確的數(shù)據(jù)。而程序員要保證用戶所提交的數(shù)據(jù)的合法正確性,除了能夠編寫(xiě)一些基本的且嚴(yán)格的數(shù)據(jù)驗(yàn)證程序以外,還必須對(duì)自己所使用的程序語(yǔ)言以及數(shù)據(jù)庫(kù)系統(tǒng)中,可能存在的安全漏洞有所了解,并能進(jìn)行改善優(yōu)化。對(duì)于ASP技術(shù)平臺(tái)而言,Request函數(shù)是一切用戶數(shù)據(jù)的入口,只要優(yōu)化好這個(gè)函數(shù)的安全性能,就可以將一切SQL注入拒于門(mén)外。

      參考文獻(xiàn):

      [1] [美] Justin ClarkeSQL注入攻擊與防御[M].2版.施宏斌,葉愫,譯.北京:清華大學(xué)出版社,2013.

      [2] 劉宇蓉.SQL注入攻擊與防范[J].北京理工學(xué)院學(xué)報(bào),2013(3):101-103.

      [2] 萬(wàn)民,秦川.使用ASCII字符串匹配技術(shù)檢測(cè)防御SQL注入攻擊[J].南京廣播電視大學(xué)學(xué)報(bào),2013(4):80-84.

      [4] 莊小妹,陳日明.SQL Injection攻擊原理與防范[J].廣東培正學(xué)院學(xué)報(bào),2013(1):72-76.

      [5] 汪彩梅,馬婷婷.基于手動(dòng)SQL注入攻擊及防范設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)安全,2013(11):36-41.

      [6] 馬海洲,張志綱.SQL注入漏洞及防范的研發(fā)究[J].電腦知識(shí)與技術(shù),2012(5).

      [7] 李曉龍.基于SQL注入攻擊的三種防御技術(shù)[J].湖北文理學(xué)院學(xué)報(bào),2013(5):18-21.

      [8] 張永新,錢(qián)欽虎.淺談SQL注入攻擊的方法及其防范[J].硅谷,2013(1):5-6.

      [9] 楊永國(guó).SQL的注入攻擊及防范措施探討以——Microsoft SQL Server為例[J].軟件導(dǎo)刊,2013(4):155-156.

      [10] 武淑鵬.網(wǎng)站中的SQL注入攻擊及防范措施[J].消費(fèi)電子,2013(16):80-80.

      [11] 楊省偉,楊浩杰.SQL注入數(shù)據(jù)庫(kù)攻擊與防御技術(shù)研究[J].長(zhǎng)沙大學(xué)學(xué)報(bào),2013(5):75-77.

      [12] 唐宏,高勃.SQL注入漏洞的檢測(cè)與防范[J].計(jì)算機(jī)科學(xué),2008(10).

      猜你喜歡
      防范數(shù)據(jù)安全優(yōu)化
      超限高層建筑結(jié)構(gòu)設(shè)計(jì)與優(yōu)化思考
      民用建筑防煙排煙設(shè)計(jì)優(yōu)化探討
      關(guān)于優(yōu)化消防安全告知承諾的一些思考
      一道優(yōu)化題的幾何解法
      云計(jì)算中基于用戶隱私的數(shù)據(jù)安全保護(hù)方法
      電子制作(2019年14期)2019-08-20 05:43:42
      建立激勵(lì)相容機(jī)制保護(hù)數(shù)據(jù)安全
      大數(shù)據(jù)云計(jì)算環(huán)境下的數(shù)據(jù)安全
      電子制作(2017年20期)2017-04-26 06:57:48
      商業(yè)銀行信貸風(fēng)險(xiǎn)淺析及防范
      論企業(yè)并購(gòu)中的財(cái)務(wù)風(fēng)險(xiǎn)及防范措施
      SQL注入防護(hù)
      科技視界(2016年21期)2016-10-17 19:37:25
      乡城县| 天峻县| 通城县| 裕民县| 漯河市| 当雄县| 达孜县| 青浦区| 拉萨市| 白河县| 双流县| 清远市| 邛崃市| 长沙县| 依兰县| 凯里市| 西林县| 环江| 兰溪市| 吉首市| 加查县| 宣武区| 增城市| 康马县| 湘乡市| 剑河县| 长沙县| 昆山市| 新乡县| 武鸣县| 青神县| 舞阳县| 淮阳县| 松滋市| 石门县| 河池市| 巩义市| 齐齐哈尔市| 三台县| 故城县| 屯昌县|