函數(shù)daddslashes源碼分析
在根路徑下的source/function/function_文件中,我們可以找到函數(shù)daddslashes的源碼。daddslashes對(duì)addslashes函數(shù)進(jìn)行了一些擴(kuò)展,主要是增加了對(duì)數(shù)組的
在根路徑下的source/function/function_文件中,我們可以找到函數(shù)daddslashes的源碼。daddslashes對(duì)addslashes函數(shù)進(jìn)行了一些擴(kuò)展,主要是增加了對(duì)數(shù)組的支持,并對(duì)數(shù)組的鍵進(jìn)行處理。
addslashes函數(shù)與轉(zhuǎn)義字符
addslashes函數(shù)返回一個(gè)字符串,在某些特定字符前添加反斜線(xiàn),以滿(mǎn)足數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句等的需要。這些特定字符包括單引號(hào)(')、雙引號(hào)(")、反斜線(xiàn)()和NULL字符。
在PHP 5.4之前,默認(rèn)情況下,magic_quotes_gpc指令是開(kāi)啟的,實(shí)際上所有的GET、POST和COOKIE數(shù)據(jù)都經(jīng)過(guò)了addslashes()函數(shù)的處理。因此,如果已經(jīng)使用magic_quotes_gpc轉(zhuǎn)義過(guò)的字符串再次使用addslashes()函數(shù)會(huì)導(dǎo)致雙層轉(zhuǎn)義。在這種情況下,可以使用get_magic_quotes_gpc()函數(shù)進(jìn)行檢測(cè)。
daddslashes函數(shù)的實(shí)現(xiàn)
該函數(shù)通過(guò)判斷參數(shù)是否為數(shù)組來(lái)執(zhí)行不同的操作。
1. 判斷參數(shù)是否為數(shù)組
使用is_array()函數(shù)來(lái)判斷參數(shù)$string是否為數(shù)組,如果是數(shù)組,則執(zhí)行if體中的代碼。
2. 獲取數(shù)組的鍵名
使用array_keys()函數(shù)獲取數(shù)組$string中的所有鍵名,并將結(jié)果保存在變量$keys中。
3. 遍歷數(shù)組并處理鍵值
使用foreach循環(huán)遍歷數(shù)組$keys中的每一個(gè)鍵名$key。
在循環(huán)體中,首先將鍵名對(duì)應(yīng)的值賦給變量$val,然后使用unset()函數(shù)釋放掉數(shù)組$string中該鍵名對(duì)應(yīng)的元素。
接著,使用addslashes()函數(shù)對(duì)鍵名進(jìn)行處理,然后將處理后的鍵名作為新的鍵,將之前保存的值$val作為相應(yīng)的值賦給數(shù)組$string。
4. 處理非數(shù)組類(lèi)型的參數(shù)
如果參數(shù)$string不是數(shù)組類(lèi)型,則直接使用addslashes()函數(shù)對(duì)其進(jìn)行處理,并將處理后的結(jié)果賦給變量$string。
需要注意的是,這個(gè)函數(shù)在處理非數(shù)組類(lèi)型的參數(shù)時(shí)存在一個(gè)bug,如果傳入?yún)?shù)$stringtrue,函數(shù)將返回字符串類(lèi)型的數(shù)字1。
注入漏洞風(fēng)險(xiǎn)與建議
在不做任何處理的情況下,直接將用戶(hù)輸入拼接到SQL語(yǔ)句中保存到數(shù)據(jù)庫(kù),可能會(huì)導(dǎo)致SQL注入的安全風(fēng)險(xiǎn)。因此,我不建議這樣做。
在開(kāi)發(fā)過(guò)程中,為了防止SQL注入攻擊,通常會(huì)使用一些安全的方法來(lái)處理用戶(hù)輸入,比如使用mysql_escape_string函數(shù)或者框架提供的防注入機(jī)制。