十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1,避免將用戶提供的輸入直接放入SQL語(yǔ)句中,最好使用準(zhǔn)備好的語(yǔ)句和參數(shù)化查詢,這樣更加安全。
10余年的西豐網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整西豐建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“西豐網(wǎng)站設(shè)計(jì)”,“西豐網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
2,不要將敏感數(shù)據(jù)保存在純文本中,加密存儲(chǔ)在數(shù)據(jù)庫(kù)中的私有或機(jī)密數(shù)據(jù),這樣可以提供另一級(jí)保護(hù),以防止攻擊者成功地排出敏感數(shù)據(jù)。
3,將數(shù)據(jù)庫(kù)用戶的功能設(shè)置為最低要求,這將限制攻擊者在設(shè)法獲取訪問權(quán)限時(shí)可以執(zhí)行的操作。
4,避免直接向用戶顯示數(shù)據(jù)庫(kù)錯(cuò)誤,攻擊者可以使用這些錯(cuò)誤消息來獲取有關(guān)數(shù)據(jù)庫(kù)的信息。
5,對(duì)訪問數(shù)據(jù)庫(kù)的Web應(yīng)用程序使用防火墻,這樣可以為面向Web的應(yīng)用程序提供保護(hù),可以幫助識(shí)別SQL注入嘗試;根據(jù)設(shè)置,還可以幫助防止SQL注入嘗試到達(dá)應(yīng)用程序。
6,定期測(cè)試與數(shù)據(jù)庫(kù)交互的Web應(yīng)用程序,這樣做可以幫助捕獲可能允許SQL注入的新錯(cuò)誤或回歸。
7,將數(shù)據(jù)庫(kù)更新為最新的可用修補(bǔ)程序,這可以防止攻擊者利用舊版本中存在的已知弱點(diǎn)或錯(cuò)誤。
一、 SQL注入攻擊的簡(jiǎn)單示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面這條語(yǔ)句是很普通的一條SQL語(yǔ)句,他主要實(shí)現(xiàn)的功能就是讓用戶輸入一個(gè)員工編號(hào)然后查詢處這個(gè)員工的信息。但是若這條語(yǔ)句被不法攻擊者改裝過后,就可能成為破壞數(shù)據(jù)的黑手。如攻擊者在輸入變量的時(shí)候,輸入以下內(nèi)容SA001’;drop table c_order--。那么以上這條SQL語(yǔ)句在執(zhí)行的時(shí)候就變?yōu)榱薙ELECT * FROM Users WHERE Value= ‘SA001’;drop table c_order--。
這條語(yǔ)句是什么意思呢?‘SA001’后面的分號(hào)表示一個(gè)查詢的結(jié)束和另一條語(yǔ)句的開始。c_order后面的雙連字符 指示當(dāng)前行余下的部分只是一個(gè)注釋,應(yīng)該忽略。如果修改后的代碼語(yǔ)法正確,則服務(wù)器將執(zhí)行該代碼。系統(tǒng)在處理這條語(yǔ)句時(shí),將首先執(zhí)行查詢語(yǔ)句,查到用戶編號(hào)為SA001 的用戶信息。然后,數(shù)據(jù)將刪除表C_ORDER(如果沒有其他主鍵等相關(guān)約束,則刪除操作就會(huì)成功)。只要注入的SQL代碼語(yǔ)法正確,便無法采用編程方式來檢測(cè)篡改。因此,必須驗(yàn)證所有用戶輸入,并仔細(xì)檢查在您所用的服務(wù)器中執(zhí)行構(gòu)造 SQL命令的代碼。
二、 SQL注入攻擊原理。
可見SQL注入攻擊的危害性很大。在講解其防止辦法之前,數(shù)據(jù)庫(kù)管理員有必要先了解一下其攻擊的原理。這有利于管理員采取有針對(duì)性的防治措施。
SQL注入是目前比較常見的針對(duì)數(shù)據(jù)庫(kù)的一種攻擊方式。在這種攻擊方式中,攻擊者會(huì)將一些惡意代碼插入到字符串中。然后會(huì)通過各種手段將該字符串傳遞到SQLServer數(shù)據(jù)庫(kù)的實(shí)例中進(jìn)行分析和執(zhí)行。只要這個(gè)惡意代碼符合SQL語(yǔ)句的規(guī)則,則在代碼編譯與執(zhí)行的時(shí)候,就不會(huì)被系統(tǒng)所發(fā)現(xiàn)。
SQL注入式攻擊的主要形式有兩種。一是直接將代碼插入到與SQL命令串聯(lián)在一起并使得其以執(zhí)行的用戶輸入變量。上面筆者舉的例子就是采用了這種方法。由于其直接與SQL語(yǔ)句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲(chǔ)或者作為原書據(jù)存儲(chǔ)的字符串。在存儲(chǔ)的字符串中會(huì)連接到一個(gè)動(dòng)態(tài)的SQL命令中,以執(zhí)行一些惡意的SQL代碼。
注入過程的工作方式是提前終止文本字符串,然后追加一個(gè)新的命令。如以直接注入式攻擊為例。就是在用戶輸入變量的時(shí)候,先用一個(gè)分號(hào)結(jié)束當(dāng)前的語(yǔ)句。然后再插入一個(gè)惡意SQL語(yǔ)句即可。由于插入的命令可能在執(zhí)行前追加其他字符串,因此攻擊者常常用注釋標(biāo)記“—”來終止注入的字符串。執(zhí)行時(shí),系統(tǒng)會(huì)認(rèn)為此后語(yǔ)句位注釋,故后續(xù)的文本將被忽略,不背編譯與執(zhí)行。
三、 SQL注入式攻擊的防治。
既然SQL注入式攻擊的危害這么大,那么該如何來防治呢?下面這些建議或許對(duì)數(shù)據(jù)庫(kù)管理員防治SQL注入式攻擊有一定的幫助。
1、 普通用戶與系統(tǒng)管理員用戶的權(quán)限要有嚴(yán)格的區(qū)分。
如果一個(gè)普通用戶在使用查詢語(yǔ)句中嵌入另一個(gè)Drop Table語(yǔ)句,那么是否允許執(zhí)行呢?由于Drop語(yǔ)句關(guān)系到數(shù)據(jù)庫(kù)的基本對(duì)象,故要操作這個(gè)語(yǔ)句用戶必須有相關(guān)的權(quán)限。在權(quán)限設(shè)計(jì)中,對(duì)于終端用戶,即應(yīng)用軟件的使用者,沒有必要給他們數(shù)據(jù)庫(kù)對(duì)象的建立、刪除等權(quán)限。那么即使在他們使用SQL語(yǔ)句中帶有嵌入式的惡意代碼,由于其用戶權(quán)限的限制,這些代碼也將無法被執(zhí)行。故應(yīng)用程序在設(shè)計(jì)的時(shí)候,最好把系統(tǒng)管理員的用戶與普通用戶區(qū)分開來。如此可以最大限度的減少注入式攻擊對(duì)數(shù)據(jù)庫(kù)帶來的危害。
2、 強(qiáng)迫使用參數(shù)化語(yǔ)句。
如果在編寫SQL語(yǔ)句的時(shí)候,用戶輸入的變量不是直接嵌入到SQL語(yǔ)句。而是通過參數(shù)來傳遞這個(gè)變量的話,那么就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對(duì)不能夠直接被嵌入到SQL語(yǔ)句中。與此相反,用戶的輸入的內(nèi)容必須進(jìn)行過濾,或者使用參數(shù)化的語(yǔ)句來傳遞用戶輸入的變量。參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語(yǔ)句中。采用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現(xiàn)在支持參數(shù)化語(yǔ)句的數(shù)據(jù)庫(kù)引擎并不多。不過數(shù)據(jù)庫(kù)工程師在開發(fā)產(chǎn)品的時(shí)候要盡量采用參數(shù)化語(yǔ)句。
3、 加強(qiáng)對(duì)用戶輸入的驗(yàn)證。
總體來說,防治SQL注入式攻擊可以采用兩種方法,一是加強(qiáng)對(duì)用戶輸入內(nèi)容的檢查與驗(yàn)證;二是強(qiáng)迫使用參數(shù)化語(yǔ)句來傳遞用戶輸入的內(nèi)容。在SQLServer數(shù)據(jù)庫(kù)中,有比較多的用戶輸入內(nèi)容驗(yàn)證工具,可以幫助管理員來對(duì)付SQL注入式攻擊。測(cè)試字符串變量的內(nèi)容,只接受所需的值。拒絕包含二進(jìn)制數(shù)據(jù)、轉(zhuǎn)義序列和注釋字符的輸入內(nèi)容。這有助于防止腳本注入,防止某些緩沖區(qū)溢出攻擊。測(cè)試用戶輸入內(nèi)容的大小和數(shù)據(jù)類型,強(qiáng)制執(zhí)行適當(dāng)?shù)南拗婆c轉(zhuǎn)換。這即有助于防止有意造成的緩沖區(qū)溢出,對(duì)于防治注入式攻擊有比較明顯的效果。
如可以使用存儲(chǔ)過程來驗(yàn)證用戶的輸入。利用存儲(chǔ)過程可以實(shí)現(xiàn)對(duì)用戶輸入變量的過濾,如拒絕一些特殊的符號(hào)。如以上那個(gè)惡意代碼中,只要存儲(chǔ)過程把那個(gè)分號(hào)過濾掉,那么這個(gè)惡意代碼也就沒有用武之地了。在執(zhí)行SQL語(yǔ)句之前,可以通過數(shù)據(jù)庫(kù)的存儲(chǔ)過程,來拒絕接納一些特殊的符號(hào)。在不影響數(shù)據(jù)庫(kù)應(yīng)用的前提下,應(yīng)該讓數(shù)據(jù)庫(kù)拒絕包含以下字符的輸入。如分號(hào)分隔符,它是SQL注入式攻擊的主要幫兇。如注釋分隔符。注釋只有在數(shù)據(jù)設(shè)計(jì)的時(shí)候用的到。一般用戶的查詢語(yǔ)句中沒有必要注釋的內(nèi)容,故可以直接把他拒絕掉,通常情況下這么做不會(huì)發(fā)生意外損失。把以上這些特殊符號(hào)拒絕掉,那么即使在SQL語(yǔ)句中嵌入了惡意代碼,他們也將毫無作為。
故始終通過測(cè)試類型、長(zhǎng)度、格式和范圍來驗(yàn)證用戶輸入,過濾用戶輸入的內(nèi)容。這是防止SQL注入式攻擊的常見并且行之有效的措施。
4、 多多使用SQL Server數(shù)據(jù)庫(kù)自帶的安全參數(shù)。
為了減少注入式攻擊對(duì)于SQL Server數(shù)據(jù)庫(kù)的不良影響,在SQLServer數(shù)據(jù)庫(kù)專門設(shè)計(jì)了相對(duì)安全的SQL參數(shù)。在數(shù)據(jù)庫(kù)設(shè)計(jì)過程中,工程師要盡量采用這些參數(shù)來杜絕惡意的SQL注入式攻擊。
如在SQL Server數(shù)據(jù)庫(kù)中提供了Parameters集合。這個(gè)集合提供了類型檢查和長(zhǎng)度驗(yàn)證的功能。如果管理員采用了Parameters這個(gè)集合的話,則用戶輸入的內(nèi)容將被視為字符值而不是可執(zhí)行代碼。即使用戶輸入的內(nèi)容中含有可執(zhí)行代碼,則數(shù)據(jù)庫(kù)也會(huì)過濾掉。因?yàn)榇藭r(shí)數(shù)據(jù)庫(kù)只把它當(dāng)作普通的字符來處理。使用Parameters集合的另外一個(gè)優(yōu)點(diǎn)是可以強(qiáng)制執(zhí)行類型和長(zhǎng)度檢查,范圍以外的值將觸發(fā)異常。如果用戶輸入的值不符合指定的類型與長(zhǎng)度約束,就會(huì)發(fā)生異常,并報(bào)告給管理員。如上面這個(gè)案例中,如果員工編號(hào)定義的數(shù)據(jù)類型為字符串型,長(zhǎng)度為10個(gè)字符。而用戶輸入的內(nèi)容雖然也是字符類型的數(shù)據(jù),但是其長(zhǎng)度達(dá)到了20個(gè)字符。則此時(shí)就會(huì)引發(fā)異常,因?yàn)橛脩糨斎氲膬?nèi)容長(zhǎng)度超過了數(shù)據(jù)庫(kù)字段長(zhǎng)度的限制。
5、 多層環(huán)境如何防治SQL注入式攻擊?
在多層應(yīng)用環(huán)境中,用戶輸入的所有數(shù)據(jù)都應(yīng)該在驗(yàn)證之后才能被允許進(jìn)入到可信區(qū)域。未通過驗(yàn)證過程的數(shù)據(jù)應(yīng)被數(shù)據(jù)庫(kù)拒絕,并向上一層返回一個(gè)錯(cuò)誤信息。實(shí)現(xiàn)多層驗(yàn)證。對(duì)無目的的惡意用戶采取的預(yù)防措施,對(duì)堅(jiān)定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的后續(xù)點(diǎn)上驗(yàn)證輸入。如在客戶端應(yīng)用程序中驗(yàn)證數(shù)據(jù)可以防止簡(jiǎn)單的腳本注入。但是,如果下一層認(rèn)為其輸入已通過驗(yàn)證,則任何可以繞過客戶端的惡意用戶就可以不受限制地訪問系統(tǒng)。故對(duì)于多層應(yīng)用環(huán)境,在防止注入式攻擊的時(shí)候,需要各層一起努力,在客戶端與數(shù)據(jù)庫(kù)端都要采用相應(yīng)的措施來防治SQL語(yǔ)句的注入式攻擊。
6、 必要的情況下使用專業(yè)的漏洞掃描工具來尋找可能被攻擊的點(diǎn)。
使用專業(yè)的漏洞掃描工具,可以幫助管理員來尋找可能被SQL注入式攻擊的點(diǎn)。不過漏洞掃描工具只能發(fā)現(xiàn)攻擊點(diǎn),而不能夠主動(dòng)起到防御SQL注入攻擊的作用。當(dāng)然這個(gè)工具也經(jīng)常被攻擊者拿來使用。如攻擊者可以利用這個(gè)工具自動(dòng)搜索攻擊目標(biāo)并實(shí)施攻擊。為此在必要的情況下,企業(yè)應(yīng)當(dāng)投資于一些專業(yè)的漏洞掃描工具。一個(gè)完善的漏洞掃描程序不同于網(wǎng)絡(luò)掃描程序,它專門查找數(shù)據(jù)庫(kù)中的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發(fā)現(xiàn)的漏洞。所以憑借專業(yè)的工具,可以幫助管理員發(fā)現(xiàn)SQL注入式漏洞,并提醒管理員采取積極的措施來預(yù)防SQL注入式攻擊。如果攻擊者能夠發(fā)現(xiàn)的SQL注入式漏洞數(shù)據(jù)庫(kù)管理員都發(fā)現(xiàn)了并采取了積極的措施堵住漏洞,那么攻擊者也就無從下手了。
首先我們來了解下什么是SQL注入,SQL注入簡(jiǎn)單來講就是將一些非法參數(shù)插入到網(wǎng)站數(shù)據(jù)庫(kù)中去,執(zhí)行一些sql命令,比如查詢數(shù)據(jù)庫(kù)的賬號(hào)密碼,數(shù)據(jù)庫(kù)的版本,數(shù)據(jù)庫(kù)服務(wù)器的IP等等的一些操作,sql注入是目前網(wǎng)站漏洞中危害最大的一個(gè)漏洞,受攻擊的網(wǎng)站占大多數(shù)都是sql注入攻擊。
sql注入攻擊用英語(yǔ)來講Structured Query Language,在網(wǎng)站的編程語(yǔ)言當(dāng)中是一種比較另類的網(wǎng)站開發(fā)語(yǔ)言,我們網(wǎng)站安全行業(yè)通常來講sql是用來數(shù)據(jù)庫(kù)查詢的一種網(wǎng)站開發(fā)語(yǔ)言,同時(shí)也是一種腳本文件的一個(gè)文件名,通俗來講sql就是用來對(duì)網(wǎng)站的數(shù)據(jù)庫(kù)進(jìn)行查詢,以及增加,寫入,更新數(shù)據(jù)庫(kù)的一個(gè)sql數(shù)據(jù)庫(kù)操作。
關(guān)于數(shù)據(jù)庫(kù)我們分為2種數(shù)據(jù)庫(kù),一種是關(guān)系數(shù)據(jù)庫(kù),非關(guān)系數(shù)據(jù)庫(kù),那么目前網(wǎng)站使用的都是關(guān)系數(shù)據(jù)庫(kù),關(guān)系數(shù)據(jù)庫(kù)分為sql數(shù)據(jù)庫(kù),microsoft sql server數(shù)據(jù)庫(kù),ACC數(shù)據(jù)庫(kù),mysql數(shù)據(jù)庫(kù),oracle數(shù)據(jù)庫(kù),DB2數(shù)據(jù)庫(kù),postgresql數(shù)據(jù)庫(kù)等等的關(guān)系數(shù)據(jù)庫(kù),非關(guān)系數(shù)據(jù)庫(kù)分為nosql數(shù)據(jù)庫(kù),可以存儲(chǔ)很大數(shù)據(jù),針對(duì)于一些并發(fā)較高,存儲(chǔ)較多,云計(jì)算的場(chǎng)景,頻繁讀取寫入的數(shù)據(jù)庫(kù),像memcachedb,redis,mongodb等等非關(guān)系數(shù)據(jù)庫(kù)。
那么什么是sql注入呢? 簡(jiǎn)單來講就是對(duì)網(wǎng)站強(qiáng)行進(jìn)行插入數(shù)據(jù),執(zhí)行sql惡意語(yǔ)句對(duì)網(wǎng)站進(jìn)行攻擊,對(duì)網(wǎng)站進(jìn)行sql注入嘗試,可以獲取一些私密的信息,像數(shù)據(jù)庫(kù)的版本,管理員的賬號(hào)密碼等等。
關(guān)于如何防止sql注入攻擊,我們從以下幾點(diǎn)開始入手
首先我們可以了解到sql注入攻擊都是通過拼接的方式,把一些惡意的參數(shù)拼接到一起,然后在網(wǎng)站的前端中插入,并執(zhí)行到服務(wù)器后端到數(shù)據(jù)庫(kù)中去,通常我們?cè)趯慞HP網(wǎng)站代碼的時(shí)候會(huì)將get ID這個(gè)參數(shù)值獲取到后直接拼接到后端服務(wù)器中去,查詢數(shù)據(jù)庫(kù),但是如果拼接了一些惡意的非法參數(shù),那么久可以當(dāng)做sql語(yǔ)句來執(zhí)行,如果防止sql注入呢?
為了防止網(wǎng)站被sql注入攻擊,我們應(yīng)該從一開始寫代碼的時(shí)候就應(yīng)該過濾一些sql注入的非法參數(shù),將查詢的一些sql語(yǔ)句,以及用戶輸入的參數(shù)值都以字符串的方式來處理,不論用戶輸入的什么東西,在sql查詢的時(shí)候只是一段字符串,這樣構(gòu)造的任何惡意參數(shù)都會(huì)以字符串的方式去查詢數(shù)據(jù)庫(kù),一直惡意的sql注入攻擊就不會(huì)被執(zhí)行,sql注入語(yǔ)句也就沒有效果了,再一個(gè)就是網(wǎng)站里的任何一個(gè)可以寫入的地方盡可能的嚴(yán)格過濾與限制,漏下一個(gè)可以輸入的地方網(wǎng)站就會(huì)被攻擊,網(wǎng)站就會(huì)被黑,所有做的網(wǎng)站安全就會(huì)沒有效果,包括一些get,post,cookie方式的提交都是不可信的,像數(shù)據(jù)表里referer user-agent等字段都是可以偽造,寫入sql注入語(yǔ)句的,像前端時(shí)間爆發(fā)的ecshop漏洞利用的就是user.php,偽造referer參數(shù)進(jìn)行了sql注入,執(zhí)行了遠(yuǎn)程代碼。
再一個(gè)防止sql注入的方法就是開啟PHP的魔術(shù)配置,開啟安全配置模式,將safe_mode開啟on.以及關(guān)閉全局變量模式,register_globals參數(shù)設(shè)置為on,magic_quotes_gpc參數(shù)開啟,防止sql注入.如果對(duì)網(wǎng)站防止sql注入不懂的話,也可以找專業(yè)的網(wǎng)站安全公司來做安全,防止sql注入。
關(guān)于SQL注入攻擊與防范
隨著網(wǎng)絡(luò)的普及,關(guān)系數(shù)據(jù)庫(kù)的廣泛應(yīng)用,網(wǎng)絡(luò)安全越來越重要。下面是我為大家搜索整理了關(guān)于SQL注入攻擊與防范,歡迎參考閱讀,希望對(duì)大家有所幫助。想了解更多相關(guān)信息請(qǐng)持續(xù)關(guān)注我們應(yīng)屆畢業(yè)生培訓(xùn)網(wǎng)!
一、 SQL注入攻擊
簡(jiǎn)言之,SQL注入是應(yīng)用程序開發(fā)人員未預(yù)期地把SQL代碼傳入到應(yīng)用程序的過程。它由于應(yīng)用程序的糟糕設(shè)計(jì)而成為可能,并且只有那些直接使用用戶提供的值構(gòu)建SQL語(yǔ)句的應(yīng)用程序才會(huì)受影響。
例如:用戶輸入客戶ID后,GridView顯示客戶的全部行記錄。在一個(gè)更加真實(shí)的案例中,用戶還要輸入密碼之類的驗(yàn)證信息,或者根據(jù)前面的登錄頁(yè)面得到用戶ID,可能還會(huì)有一些用戶輸入關(guān)鍵信息的文本框,如訂單的日期范圍或產(chǎn)品名稱。問題在于命令是如何被執(zhí)行的。在這個(gè)示例中,SQL語(yǔ)句通過字符串構(gòu)造技術(shù)動(dòng)態(tài)創(chuàng)建。文本框txtID的值被直接復(fù)制到字符串中。下面是代碼:
在這個(gè)示例中,攻擊者可以篡改SQL語(yǔ)句。通常,攻擊的第一個(gè)目標(biāo)是得到錯(cuò)誤信息。如果錯(cuò)誤沒有被恰當(dāng)處理,底層的信息就會(huì)暴露給攻擊者。這些信息可用于進(jìn)一步攻擊。
例如,想象一下在文本一下在文本框中輸入下面的字符串會(huì)發(fā)生什么?
ALFKI'OR '1'='1
再看看因此生成的完整SQL語(yǔ)句:
這條語(yǔ)句將返回所有的訂單記錄,即便那些訂單不是由ALFDI創(chuàng)建,因?yàn)閷?duì)每一行而言而有信1=1總是true。這樣產(chǎn)生的后果是沒有顯示當(dāng)前用戶特定信息,卻向攻擊者顯示了全部資料,如果屏幕上顯示的是敏感信息,如社會(huì)保險(xiǎn)號(hào),生日或信用卡資料,就會(huì)帶來嚴(yán)重的問題。事實(shí)上,這些簡(jiǎn)單的SQL注入往往是困擾那些大型電子商務(wù)公司的麻煩。一般而言,攻擊點(diǎn)不在于文本框而在于查詢字符串(可被用于向數(shù)據(jù)庫(kù)傳送值,如列表頁(yè)向詳細(xì)信息頁(yè)面?zhèn)魉臀ㄒ粯?biāo)識(shí)符)。
還可以進(jìn)行更復(fù)雜的攻擊。例如,攻擊者可以使用兩個(gè)連接號(hào)(--)注釋掉SQL語(yǔ)句的剩余部分。這樣的攻擊只限于SQL Server,不過對(duì)于其他類型的數(shù)據(jù)庫(kù)也有等效的辦法,如MySql使用(#)號(hào),Oracle使用(;)號(hào)。另外攻擊者還可以執(zhí)行含有任意SQL語(yǔ)句的批處理命令。對(duì)于SQL Server提供程序,攻擊者只需在新命令前加上分號(hào)(;)。攻擊者可以采用這樣的方式刪除其他表的內(nèi)容,甚至調(diào)用SQL Server的系統(tǒng)存儲(chǔ)過程xp_cmdshell在命令執(zhí)行任意的程序。
下面是攻擊者在文本框中輸入的,它的攻擊目標(biāo)是刪除Customers表的全部行。
LUNCHUN’;DELETE*FROM Customers--
二、防范
如何預(yù)防SQL注入攻擊呢?需要記住幾點(diǎn)。首先,使用TextBox.MaxLength屬性防止用戶輸入過長(zhǎng)的字符是一個(gè)好辦法。因?yàn)樗鼈儾粔蜷L(zhǎng),也就減少了貼入大量腳本的可能性。其次,要使用ASP.NET驗(yàn)證控件鎖定錯(cuò)誤的數(shù)據(jù)(如文本、空格、數(shù)值中的特殊字符)。另外,要限制錯(cuò)誤信息給出的提示。捕獲到數(shù)據(jù)庫(kù)異常時(shí),只顯示一些通用的信息(如“數(shù)據(jù)源錯(cuò)誤”)而不是顯示Exception.Message屬性中的信息,它可能暴露了系統(tǒng)攻擊點(diǎn)。
更為重要的是,一定要小心去除特殊字符。比如,可以將單引號(hào)替換為兩個(gè)單引號(hào),這樣它們就不會(huì)和SQL語(yǔ)句的分隔符混淆:
string ID=txtID.Text().Replace(“’”,”’’”);
當(dāng)然,如果文本確實(shí)需要包含單引號(hào),這樣做就引入了其他麻煩。另外,某些SQL注入攻擊還是可行的。替換單引號(hào)可以防止用戶提前結(jié)束一個(gè)字符串,然而,如果動(dòng)態(tài)構(gòu)建含有數(shù)值的SQL語(yǔ)句,SQL注入攻擊又有發(fā)揮的空間了。這個(gè)漏洞常被(這是很危險(xiǎn)的)忽視。更好的解決辦法是使用參數(shù)化的命令或使用存儲(chǔ)過程執(zhí)行轉(zhuǎn)義以防止SQL注入攻擊。
另一個(gè)好建議是限制用于訪問數(shù)據(jù)庫(kù)的賬號(hào)的權(quán)限。這樣該賬號(hào)將沒有權(quán)限訪問其他數(shù)據(jù)庫(kù)或執(zhí)行擴(kuò)展的存儲(chǔ)過程。不過這樣并不能解決SQL腳本注入的問題,因?yàn)橛糜谶B接數(shù)據(jù)庫(kù)的進(jìn)程幾乎總是需要比任意單個(gè)用戶更大的權(quán)限。通過限制權(quán)限,可以預(yù)防刪除表的攻擊,但不能阻止攻擊者偷看別人的.信息
三、POST注入攻擊
精明的用戶可能會(huì)知道還有另外一個(gè)Web控件攻擊的潛在途徑。雖然參數(shù)化的命令防止了SQL注入攻擊,但它們不能阻止攻擊者向回發(fā)到服務(wù)器的數(shù)據(jù)添加惡意的值。如果不檢查這些值,就使得攻擊者可以提交本來不可能存在的控件值。
例如,假設(shè)你有一個(gè)顯示當(dāng)前用戶訂單的列表。狡詐的攻擊者可能保存該頁(yè)面的一個(gè)本地副本,修改HTML內(nèi)容向列表添加更多的項(xiàng)目,然后選擇某個(gè)“假”的項(xiàng)目。如果攻擊成功,攻擊者就能夠看到其他用戶訂單,這顯然是一個(gè)問題。幸好,ASP.NET使用一個(gè)很少被提及的叫做“事件驗(yàn)證”的特性來防止這種攻擊。事件驗(yàn)證檢查回發(fā)到服務(wù)器的數(shù)據(jù)并驗(yàn)證其中值的合法性。例如,如果回發(fā)的數(shù)據(jù)表明用戶選擇了一個(gè)沒有意義的數(shù)據(jù)(因?yàn)樗诳丶胁⒉淮嬖?,ASP.NET就產(chǎn)生一個(gè)錯(cuò)誤并停止處理。可以在Page指令中設(shè)置EnableEventValidation特性為false來禁用事件驗(yàn)證。創(chuàng)建使用客戶端腳本動(dòng)態(tài)改變內(nèi)容的頁(yè)面時(shí),需要執(zhí)行這一步。不過,此時(shí)在使用這些值之前要注意檢查潛在的POST注入攻擊。
;
SQL注入漏洞攻擊的防范方法有很多種,現(xiàn)階段總結(jié)起來有以下方法:
(1)數(shù)據(jù)有效性校驗(yàn)。如果一個(gè)輸入框只可能包括數(shù)字,那么要通過校驗(yàn)確保用戶輸入的都是數(shù)字。如果可以接受字母,那就要檢查是不是存在不可接受的字符,最好的方法是增加字符復(fù)雜度自動(dòng)驗(yàn)證功能。確保應(yīng)用程序要檢查以下字符:分號(hào)、等號(hào)、破折號(hào)、括號(hào)以及SQL關(guān)鍵字。另外限制表單數(shù)據(jù)輸入和查詢字符串輸入的長(zhǎng)度也是一個(gè)好方法。如果用戶的登錄名最多只有10個(gè)字符,那么不要認(rèn)可表單中輸入10個(gè)以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
(2)封裝數(shù)據(jù)信息。對(duì)客戶端提交的數(shù)據(jù)進(jìn)行封裝,不要將數(shù)據(jù)直接存入cookie中,方法就是在編程的代碼中,插入session、if、try、else,這樣可以有效地防止攻擊者獲取cookie中的重要信息。
(3)去除代碼中的敏感信息。將在代碼中存在的用戶名、口令信息等敏感字段刪除,替換成輸入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:這樣顯然會(huì)暴露管理員的用戶名、口令信息。可以將其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
這樣就安全了很多,入侵者也是不會(huì)輕易的就獲取到用戶名、口令信息。
(4)替換或刪除單引號(hào)。使用雙引號(hào)替換掉所有用戶輸入的單引號(hào),這個(gè)簡(jiǎn)單的預(yù)防措施將在很大程度上預(yù)防SQL注入漏洞攻擊,單引號(hào)時(shí)常會(huì)無法約束插入數(shù)據(jù)的Value,可能給予輸入者不必要的權(quán)限。用雙引號(hào)替換掉單引號(hào)可以使大部分SQL注入漏洞攻擊失敗。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
顯然會(huì)得到與
“select * from users where username='admin' and password= '1234567'”
相同的結(jié)果。
(5)指定錯(cuò)誤返回頁(yè)面。攻擊者有時(shí)從客戶端嘗試提交有害代碼和攻擊字符串,根據(jù)Web Service給出的錯(cuò)誤提示信息來收集程序及服務(wù)器的信息,從而獲取想得到的資料。應(yīng)在Web Service中指定一個(gè)不包含任何信息的錯(cuò)誤提示頁(yè)面。
(6)限制SQL字符串連接的配置文件。使用SQL變量,因?yàn)樽兞坎皇强梢詧?zhí)行的腳本,即在Web頁(yè)面中將連接數(shù)據(jù)庫(kù)的SQL字符串替換成指定的Value,然后將Web.config文件進(jìn)行加密,拒絕訪問。
(7)設(shè)置Web目錄的訪問權(quán)限。將虛擬站點(diǎn)的文件目錄禁止游客用戶(如:Guest用戶等)訪問,將User用戶權(quán)限修改成只讀權(quán)限,切勿將管理權(quán)限的用戶添加到訪問列表。
(8)最小服務(wù)原則。Web服務(wù)器應(yīng)以最小權(quán)限進(jìn)行配置,只提供Web服務(wù),這樣可以有效地阻止系統(tǒng)的危險(xiǎn)命令,如ftp、cmd、vbscript等。
(9)鑒別信息加密存儲(chǔ)。將保存在數(shù)據(jù)庫(kù)users表中的用戶名、口令信息以密文形式保存,也可以對(duì)users表進(jìn)行加密處理,這樣可以大大增加對(duì)鑒別信息訪問的安全級(jí)別。
(10)用戶權(quán)限分離。應(yīng)盡可能的禁止或刪除數(shù)據(jù)庫(kù)中sa權(quán)限用戶的訪問,對(duì)不同的數(shù)據(jù)庫(kù)劃分不同的用戶權(quán)限,這樣不同的用戶只能對(duì)授權(quán)給自己的數(shù)據(jù)庫(kù)執(zhí)行查詢、插入、更新、刪除操作,就可以防止不同用戶對(duì)非授權(quán)的數(shù)據(jù)庫(kù)進(jìn)行訪問。