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