php防止sql注入的方法詳解
一、什么是SQL注入式攻擊?
所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁(yè)面請(qǐng)求的查詢(xún)字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶(hù)輸入的內(nèi)容直接用來(lái)構(gòu)造(或者影響)動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過(guò)程的輸入?yún)?shù),這類(lèi)表單特別容易受到SQL注入式攻擊。常見(jiàn)的SQL注入式攻擊過(guò)程類(lèi)如:
⑴ 某個(gè)ASP.NET Web應(yīng)用有一個(gè)登錄頁(yè)面,這個(gè)登錄頁(yè)面控制著用戶(hù)是否有權(quán)訪問(wèn)應(yīng)用,它要求用戶(hù)輸入一個(gè)名稱(chēng)和密碼。
⑵ 登錄頁(yè)面中輸入的內(nèi)容將直接用來(lái)構(gòu)造動(dòng)態(tài)的SQL命令,或者直接用作存儲(chǔ)過(guò)程的參數(shù)。下面是ASP.NET應(yīng)用構(gòu)造查詢(xún)的一個(gè)例子:
System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = '")。Append(txtLogin.Text)。Append("' AND password='")。Append(txtPassword.Text)。Append("'");
⑶ 攻擊者在用戶(hù)名字和密碼輸入框中輸入"'或'1'='1"之類(lèi)的內(nèi)容。
⑷ 用戶(hù)輸入的內(nèi)容提交給服務(wù)器之后,服務(wù)器運(yùn)行上面的ASP.NET代碼構(gòu)造出查詢(xún)用戶(hù)的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'.
⑸ 服務(wù)器執(zhí)行查詢(xún)或存儲(chǔ)過(guò)程,將用戶(hù)輸入的身份信息和服務(wù)器中保存的身份信息進(jìn)行對(duì)比。
⑹ 由于SQL命令實(shí)際上已被注入式攻擊修改,已經(jīng)不能真正驗(yàn)證用戶(hù)身份,所以系統(tǒng)會(huì)錯(cuò)誤地授權(quán)給攻擊者。
如果攻擊者知道應(yīng)用會(huì)將表單中輸入的內(nèi)容直接用于驗(yàn)證身份的查詢(xún),他就會(huì)嘗試輸入某些特殊的SQL字符串篡改查詢(xún)改變其原來(lái)的功能,欺騙系統(tǒng)授予訪問(wèn)權(quán)限。
系統(tǒng)環(huán)境不同,攻擊者可能造成的損害也不同,這主要由應(yīng)用訪問(wèn)數(shù)據(jù)庫(kù)的安全權(quán)限決定。如果用戶(hù)的帳戶(hù)具有管理員或其他比較高級(jí)的權(quán)限,攻擊者就可能對(duì)數(shù)據(jù)庫(kù)的表執(zhí)行各種他想要做的操作,包括添加、刪除或更新數(shù)據(jù),甚至可能直接刪除表。
二、如何防范?
好在要防止ASP.NET應(yīng)用被SQL注入式攻擊闖入并不是一件特別困難的事情,只要在利用表單輸入的內(nèi)容構(gòu)造SQL命令之前,把所有輸入內(nèi)容過(guò)濾一番就可以了。過(guò)濾輸入內(nèi)容可以按多種方式進(jìn)行。
(1)對(duì)于動(dòng)態(tài)構(gòu)造SQL查詢(xún)的場(chǎng)合,可以使用下面的技術(shù):
第一:替換單引號(hào),即把所有單獨(dú)出現(xiàn)的單引號(hào)改成兩個(gè)單引號(hào),防止攻擊者修改SQL命令的含義。再來(lái)看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”顯然會(huì)得到與“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的結(jié)果。
第二:刪除用戶(hù)輸入內(nèi)容中的所有連字符,防止攻擊者構(gòu)造出類(lèi)如“SELECT * from Users WHERE login = 'mas' —— AND password =''”之類(lèi)的查詢(xún),因?yàn)檫@類(lèi)查詢(xún)的后半部分已經(jīng)被注釋掉,不再有效,攻擊者只要知道一個(gè)合法的用戶(hù)登錄名稱(chēng),根本不需要知道用戶(hù)的密碼就可以順利獲得訪問(wèn)權(quán)限。
第三:對(duì)于用來(lái)執(zhí)行查詢(xún)的數(shù)據(jù)庫(kù)帳戶(hù),限制其權(quán)限。用不同的用戶(hù)帳戶(hù)執(zhí)行查詢(xún)、插入、更新、刪除操作。由于隔離了不同帳戶(hù)可執(zhí)行的操作,因而也就防止了原本用于執(zhí)行SELECT命令的地方卻被用于執(zhí)行INSERT、UPDATE或DELETE命令。
(2)用存儲(chǔ)過(guò)程來(lái)執(zhí)行所有的查詢(xún)。SQL參數(shù)的傳遞方式將防止攻擊者利用單引號(hào)和連字符實(shí)施攻擊。此外,它還使得數(shù)據(jù)庫(kù)權(quán)限可以限制到只允許特定的存儲(chǔ)過(guò)程執(zhí)行,所有的用戶(hù)輸入必須遵從被調(diào)用的存儲(chǔ)過(guò)程的安全上下文,這樣就很難再發(fā)生注入式攻擊了。
(3)限制表單或查詢(xún)字符串輸入的長(zhǎng)度。如果用戶(hù)的登錄名字最多只有10個(gè)字符,那么不要認(rèn)可表單中輸入的10個(gè)以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
(4)檢查用戶(hù)輸入的合法性,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)。數(shù)據(jù)檢查應(yīng)當(dāng)在客戶(hù)端和服務(wù)器端都執(zhí)行——之所以要執(zhí)行服務(wù)器端驗(yàn)證,是為了彌補(bǔ)客戶(hù)端驗(yàn)證機(jī)制脆弱的安全性。
在客戶(hù)端,攻擊者完全有可能獲得網(wǎng)頁(yè)的源代碼,修改驗(yàn)證合法性的腳本(或者直接刪除腳本),然后將非法內(nèi)容通過(guò)修改后的表單提交給服務(wù)器。因此,要保證驗(yàn)證操作確實(shí)已經(jīng)執(zhí)行,唯一的辦法就是在服務(wù)器端也執(zhí)行驗(yàn)證。你可以使用許多內(nèi)建的驗(yàn)證對(duì)象,例如RegularExpressionValidator,它們能夠自動(dòng)生成驗(yàn)證用的客戶(hù)端腳本,當(dāng)然你也可以插入服務(wù)器端的方法調(diào)用。如果找不到現(xiàn)成的驗(yàn)證對(duì)象,你可以通過(guò)CustomValidator自己創(chuàng)建一個(gè)。
(5) 將用戶(hù)登錄名稱(chēng)、密碼等數(shù)據(jù)加密保存。加密用戶(hù)輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫(kù)中保存的數(shù)據(jù)比較,這相當(dāng)于對(duì)用戶(hù)輸入的數(shù)據(jù)進(jìn)行了“消毒”處理,用戶(hù)輸入的數(shù)據(jù)不再對(duì)數(shù)據(jù)庫(kù)有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。System.Web.Security.FormsAuthentication類(lèi)有一個(gè)HashPasswordForStoringInConfigFile,非常適合于對(duì)輸入數(shù)據(jù)進(jìn)行消毒處理。
(6) 檢查提取數(shù)據(jù)的查詢(xún)所返回的記錄數(shù)量。如果程序只要求返回一個(gè)記錄,但實(shí)際返回的記錄卻超過(guò)一行,那就當(dāng)作出錯(cuò)處理。
(7)使用預(yù)處理語(yǔ)句
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- PHP實(shí)現(xiàn)表單提交數(shù)據(jù)的驗(yàn)證處理功能【防SQL注入和XSS攻擊等】
- PHP簡(jiǎn)單預(yù)防sql注入的方法
- PHP中防止SQL注入方法詳解
- php中$_GET與$_POST過(guò)濾sql注入的方法
- Discuz7.2版的faq.php SQL注入漏洞分析
- PHP防范SQL注入的具體方法詳解(測(cè)試通過(guò))
- PHP開(kāi)發(fā)中常見(jiàn)的安全問(wèn)題詳解和解決方法(如Sql注入、CSRF、Xss、CC等)
- php防止sql注入示例分析和幾種常見(jiàn)攻擊正則表達(dá)式
- PHP簡(jiǎn)單實(shí)現(xiàn)防止SQL注入的方法
相關(guān)文章
PHP實(shí)現(xiàn)redis限制單ip、單用戶(hù)的訪問(wèn)次數(shù)功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)redis限制單ip、單用戶(hù)的訪問(wèn)次數(shù)功能,結(jié)合實(shí)例形式分析了php連接redis及獲取、記錄客戶(hù)端信息,并限制客戶(hù)訪問(wèn)次數(shù)等操作技巧,需要的朋友可以參考下2018-06-06PHP 輸出簡(jiǎn)單動(dòng)態(tài)WAP頁(yè)面
首先,不管你是在本地調(diào)試還是想瀏覽網(wǎng)絡(luò)上的wap頁(yè)面,都需要一個(gè)能解析wap頁(yè)面的瀏覽器2009-06-06php+mysqli使用面向?qū)ο蠓绞讲樵?xún)數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要介紹了php+mysqli使用面向?qū)ο蠓绞讲樵?xún)數(shù)據(jù)庫(kù)的方法,實(shí)例分析了mysqli對(duì)象的創(chuàng)建、連接、查詢(xún)及返回結(jié)果、釋放資源等技巧,需要的朋友可以參考下2015-01-01php array_filter除去數(shù)組中的空字符元素
php array_filter除去數(shù)組中的空字符元素,array_filter() 函數(shù)根據(jù)回調(diào)函數(shù)過(guò)濾數(shù)組中的值,省略回調(diào)函數(shù)則默認(rèn)過(guò)濾空值,需要的朋友可以參考下。2011-11-11PHP貪婪算法解決0-1背包問(wèn)題實(shí)例分析
這篇文章主要介紹了PHP貪婪算法解決0-1背包問(wèn)題,實(shí)例分析了貪婪算法的原理與背包問(wèn)題的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03php使用pdo連接并查詢(xún)sql數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了php使用pdo連接并查詢(xún)sql數(shù)據(jù)庫(kù)的方法,實(shí)例分析了常用的pdo連接方法與改進(jìn)方法,并針對(duì)pdo技術(shù)進(jìn)行了分析說(shuō)明,需要的朋友可以參考下2014-12-12PHP實(shí)現(xiàn)將HTML5中Canvas圖像保存到服務(wù)器的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)將HTML5中Canvas圖像保存到服務(wù)器的方法,可實(shí)現(xiàn)將Canvas圖像保存到服務(wù)器的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11仿AS3實(shí)現(xiàn)PHP 事件機(jī)制實(shí)現(xiàn)代碼
仿AS3實(shí)現(xiàn)PHP 事件機(jī)制實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-01-01php正則preg_replace_callback函數(shù)用法實(shí)例
這篇文章主要介紹了php正則preg_replace_callback函數(shù)用法,實(shí)例分析了preg_replace_callback函數(shù)進(jìn)行正則替換的相關(guān)技巧,需要的朋友可以參考下2015-06-06php計(jì)算數(shù)組相同值出現(xiàn)次數(shù)的代碼(array_count_values)
這篇文章主要介紹了php計(jì)算數(shù)組相同值出現(xiàn)次數(shù)的代碼,需要的朋友可以參考下2015-01-01