版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Good is good, but better carries it.精益求精,善益求善。PHP中SQL注入與跨站攻擊的防范-HYPERLINK/blog/722458PHP中SQL注入與跨站攻擊的防范SQLinjection即SQL注入是我們每個(gè)WEB程序員都需要面對(duì)的問(wèn)題,一個(gè)WEB應(yīng)用假如沒(méi)有起碼的安全性,那么其它的一切就可以免談了。注入問(wèn)題在ASP上可謂是鬧得沸沸揚(yáng)揚(yáng),當(dāng)然還有不少PHP程序“遇難”。至于SQLinjection的詳情,網(wǎng)上的文章很多,在此就不作贅述。追其罪惡之源,就是我們誤以為用戶提交的數(shù)據(jù)是可靠的。無(wú)論你是否有足夠的PHP安全開(kāi)發(fā)經(jīng)驗(yàn),本文的目的就是用來(lái)幫助你構(gòu)建
2、更為安全的在線應(yīng)用程序。針對(duì)不同的情況,我們可以使用下面的一種或幾種方法來(lái)對(duì)SQL注入的風(fēng)險(xiǎn)進(jìn)行預(yù)防。1、在書(shū)寫(xiě)SQL語(yǔ)句時(shí)不要省略單引號(hào),即使是整型字段也應(yīng)該加上單引號(hào)。首先,從技術(shù)上講,引號(hào)對(duì)于數(shù)字值來(lái)說(shuō)是不需要使用的。但是,假如你不使用引號(hào)把例如書(shū)籍?dāng)?shù)量這樣的一個(gè)值括起來(lái),并且假如你的用戶把一個(gè)空值輸入到你的表單中,那么,你將會(huì)看到一個(gè)類(lèi)似下面的查詢(xún):SELECT*FROMbooksWHEREnum=當(dāng)然,這個(gè)查詢(xún)從語(yǔ)法上講是無(wú)效的;但是,下面的語(yǔ)法卻是有效的:SELECT*FROMbooksWHEREnum=第二個(gè)查詢(xún)雖然也不會(huì)返回任何結(jié)果,但是至少它不會(huì)返回一個(gè)錯(cuò)誤消息。其次,單引號(hào)
3、可以增加注入者的難度,第二句由于把變量放在一對(duì)單引號(hào)中,這樣使得我們所提交的變量都變成了字符串,即使包含了正確的SQL語(yǔ)句,也不會(huì)正常執(zhí)行,而第一句不同,由于沒(méi)有把變量放進(jìn)單引號(hào)中,那我們所提交的一切,只要包含空格,那空格后的變量都會(huì)作為SQL語(yǔ)句執(zhí)行,因此,我們要養(yǎng)成給SQL語(yǔ)句中變量加引號(hào)的習(xí)慣。2、檢查用戶提交的值的類(lèi)型,對(duì)接收到的整型參數(shù)使用intval()強(qiáng)制轉(zhuǎn)換成整形。我們知道SQL注入的主要來(lái)源往往出在一個(gè)意料之外的表單提交或URL參數(shù)中,所以當(dāng)你接受一個(gè)由用戶提交的參數(shù)時(shí),你應(yīng)該有相當(dāng)?shù)臋?quán)利來(lái)確定你想取得什么樣的輸入內(nèi)容。在以前的學(xué)習(xí)中我們已經(jīng)討論過(guò)很多這樣或那樣的校驗(yàn)問(wèn)題。因
4、此我們只要簡(jiǎn)單的總結(jié)當(dāng)時(shí)我們討論的要點(diǎn)即可比較輕易的檢查用戶提交數(shù)據(jù)的有效性。假如你期望得到的是一個(gè)數(shù)值,那么你可以使用下面這些技術(shù)之一來(lái)確保你得到的參數(shù)的安全性。使用is_int()函數(shù)(或is_integer()或is_long()。使用gettype()函數(shù)。使用intval()函數(shù)。使用settype()函數(shù)。我們通常把傳送過(guò)來(lái)的整型參數(shù)使用intval()函數(shù)強(qiáng)制轉(zhuǎn)換成整形,因?yàn)榧偃绮贿@樣做,接收到的查詢(xún)子句很可能會(huì)附帶著其它一些我們并不愿看到的語(yǔ)句,比如原本應(yīng)該是“nid=17”可能會(huì)成為“nid=17or1=1”,這會(huì)使我們預(yù)計(jì)的SQL語(yǔ)句變成這樣:SELECT*FROMnews
5、WHEREnid=17or1=1這對(duì)于一個(gè)新聞表中的信息可能不會(huì)造成什么大的危害,但假如是在顯示某個(gè)用戶的信息時(shí)呢?此外,為了檢查用戶輸入內(nèi)容的長(zhǎng)度,你可以使用strlen()函數(shù)。為了檢查一個(gè)期望的時(shí)間或日期是否有效,你可以使用strtotime()函數(shù)。它似乎一定能夠確保一位用戶的提交參數(shù)中沒(méi)有包含分號(hào)字符(除非標(biāo)點(diǎn)符號(hào)可以被合法地包括在內(nèi))。你可以借助于strpos()函數(shù)輕易地實(shí)現(xiàn)這一點(diǎn),如下所示:if(strpos($variety,;)exit($varietyisaninvalidvalueforvariety!);正如我們?cè)谇懊嫠岬降?,只要你仔?xì)分析你的用戶輸入期望,那么,你
6、應(yīng)該能夠很輕易地檢查出其中存在的許多問(wèn)題。3、使用mysql_real_escape_string()函數(shù)從查詢(xún)字符串中過(guò)濾掉危險(xiǎn)字符盡管有很多文章已經(jīng)討論過(guò)如何過(guò)濾掉危險(xiǎn)字符的問(wèn)題,但是在本文中還是讓我們?cè)俅魏?jiǎn)單的強(qiáng)調(diào)并歸納一下這個(gè)問(wèn)題:不要使用magic_quotes_gpc指令或它的搭擋addslashes()函數(shù),此函數(shù)在程序開(kāi)發(fā)中應(yīng)該是被限制使用的,在PHP的下一個(gè)版本PHP6中已經(jīng)取消了對(duì)此函數(shù)的支持,并且此函數(shù)還要求使用額外的步驟stripslashes()函數(shù)。相比之下,mysql_real_escape_string()函數(shù)更為適合,受此函數(shù)影響的字符包括:x00,n,r,x
7、1a。這二個(gè)函數(shù)的功能類(lèi)似,但addslashes()函數(shù)無(wú)法轉(zhuǎn)換以十六進(jìn)制形式提交的字符,另外需要注重的是,mysqli_real_escape_string()函數(shù)需要先建立數(shù)據(jù)庫(kù)連接,因?yàn)樾枰紤]到連接的當(dāng)前字符集,通常防止數(shù)據(jù)庫(kù)被攻擊的使用方法如下:4、對(duì)用戶輸入的字符進(jìn)行HTML編碼以防止跨站攻擊(這個(gè)一般在服務(wù)器端進(jìn)行過(guò)濾)對(duì)于數(shù)據(jù)庫(kù)防止SQL注入的問(wèn)題,通過(guò)前面三點(diǎn)所述綜合的運(yùn)用我們似乎全部解決,但假如用戶提交的內(nèi)容中有一些不良的HTML標(biāo)簽則可能會(huì)導(dǎo)致頁(yè)面變形,嚴(yán)重的還可能會(huì)出現(xiàn)跨站攻擊之類(lèi)的安全問(wèn)題,所以對(duì)帶有HTML的內(nèi)容增加過(guò)濾檢查是很有必要的。例如一段接收用戶的輸入并顯
8、示的功能代碼,一但惡意用戶輸入:location.href=;這樣的一條數(shù)據(jù),網(wǎng)頁(yè)在顯示該條數(shù)據(jù)時(shí),用戶的瀏覽器將會(huì)跳轉(zhuǎn)到惡意代碼指定的地址,這就是最簡(jiǎn)單的跨站攻擊,我們?cè)囅胍幌?,假如跳轉(zhuǎn)的地址是一個(gè)偽造原網(wǎng)站來(lái)騙取用戶密碼或銀行信息的頁(yè)面,那么會(huì)是什么樣的后果?對(duì)于這類(lèi)攻擊行為,就需要我們?cè)诮邮沼脩籼峤坏臄?shù)據(jù)時(shí)在服務(wù)器端進(jìn)行過(guò)濾,我們可以編寫(xiě)一個(gè)過(guò)濾函數(shù)用來(lái)查詢(xún)提交數(shù)據(jù)中有害字符并將之替換掉,還有一種較簡(jiǎn)便的方式就把用戶所提交的內(nèi)容中“”,“&”等符號(hào)轉(zhuǎn)換成正確的HTML編碼,而函數(shù)htmlspecialchars()正是干這個(gè)活的。htmlspecialchars()功能:將“&”五個(gè)字符
9、轉(zhuǎn)換成HTML字符串。語(yǔ)法:stringhtmlspecialchars(string,quotestyle,character-set);參數(shù):ENT_NOQUOTES,不對(duì)任何引號(hào)進(jìn)行格式化;ENT_QUOTES,對(duì)單引號(hào)及雙引號(hào)進(jìn)行格式化;默認(rèn)為ENT_COMPAT,僅編碼雙引號(hào)。返回值:字符串因此,用戶提交的數(shù)據(jù)經(jīng)過(guò)格式化后為:location.href=;這樣代碼就失去了原有的攻擊功能,可以基本預(yù)防腳本攻擊的潛在危險(xiǎn),假如不明白這之間的區(qū)別,可以測(cè)試下面這段代碼:?php$str=PHP3C技術(shù)分享社區(qū);echo$str;echo;echohtmlspecialchars($str);?另外,轉(zhuǎn)換非凡字符為HTML字符串還可以使用函數(shù)htmlentities(),使用方法相同,它與htmlspecialchars在格式化帶有英文字符的html代碼的時(shí)候沒(méi)有什么區(qū)別,但是htmlentities對(duì)中文字符也不放過(guò),所以同樣的調(diào)用方法得出來(lái)的結(jié)果是由于沒(méi)有指定字符集而默認(rèn)由ISO-8859-1代替,中文字符部分變?yōu)橐欢褋y碼,因此我們?cè)谑褂玫臅r(shí)候,需要指定參數(shù)character-set為我們頁(yè)面使用的字符集,例如UTF-8或GB2312。SQL注入
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度民商法擔(dān)保合同保險(xiǎn)條款4篇
- 2017北京市中考英語(yǔ)(含解析)
- 2025年農(nóng)行個(gè)人消費(fèi)信貸合同2篇
- 二零二五版新能源汽車(chē)充電站租賃合同合法經(jīng)營(yíng)引領(lǐng)綠色出行4篇
- 包含2025年度灑水車(chē)租賃的環(huán)保項(xiàng)目合同3篇
- 個(gè)性化畫(huà)稿合作合同2024年版版B版
- 2025年度智能家電租賃服務(wù)合同范本3篇
- 2025年度房地產(chǎn)開(kāi)發(fā)項(xiàng)目融資借款抵押合同模板4篇
- 二零二五年度城市公共安全監(jiān)控項(xiàng)目合同2篇
- 二零二五年度教育培訓(xùn)機(jī)構(gòu)場(chǎng)地租賃及課程合作合同4篇
- Q∕GDW 516-2010 500kV~1000kV 輸電線路劣化懸式絕緣子檢測(cè)規(guī)程
- 遼寧省撫順五十中學(xué)2024屆中考化學(xué)全真模擬試卷含解析
- 2024年湖南汽車(chē)工程職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案解析
- 家長(zhǎng)心理健康教育知識(shí)講座
- GB/T 292-2023滾動(dòng)軸承角接觸球軸承外形尺寸
- 軍人結(jié)婚函調(diào)報(bào)告表
- 民用無(wú)人駕駛航空器實(shí)名制登記管理規(guī)定
- 北京地鐵6號(hào)線
- 航空油料計(jì)量統(tǒng)計(jì)員(初級(jí))理論考試復(fù)習(xí)題庫(kù)大全-上(單選題匯總)
- 諒解書(shū)(標(biāo)準(zhǔn)樣本)
評(píng)論
0/150
提交評(píng)論