當使用php向資料庫中寫入或者讀取數據時,若在進行操作前對字元串進行一些處理,如:過濾處理,可能會導致某些資料庫語句因為特殊的字元引起的污染而出現致命的錯誤。為此,php中提供了一個「魔法開關」—–magic_quotes_gpc。(該開關已在5.4.0版本被刪除,始終置為off)
當magic_quotes_gpc = on時,從外部post、get、cooki過來的數據都會在預定義字元之前添加」\「。
比如:
程序中var_dump($_GET[『id』]);
輸出的結果為:
string(3) 「1\』」
預定義的字元為:
單引號(『) 雙引號(」) 反斜杠(\) NULL
當magic_quotes_gpc=off時,寫入資料庫的字元串未經過任何過濾處理,從資料庫中讀出的字元串也未作任何處理。如何這樣設置這個開關,並且沒有其他對字元串進行處理的操作,那麼可能會給資料庫的讀寫帶來問題,例如:
將數據:$data = 「insert_data』」to_mysal」;(data和to之間是一個單引號,一個雙引號)
若將字元串$data寫入資料庫中,則會出現sql語句錯誤,寫入數據失敗。
那麼如果不使用這個「開關」就沒有辦法解決這個問題了嗎?答案是否定的。
我們可以使用以下方法:
使用addslashes() 函數
函數原型:
string addslashes ( string $str )
參數:要轉義的字元串
返回值:返迴轉義後的字元串
作用:將要轉義的字元串中的預定義字元轉義,即在預定義字元前面加上反斜杠。
php中還有一個函數能轉義sql語句中使用的字元串中特殊的字元,該函數的原型如下:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier = NULL ] )
本函數將 unescaped_string 中的特殊字元轉義,並計及連接的當前字符集,因此可以安全用於 mysql_query()。
現在向資料庫中插入數據的可能會引起sql語句被污染的問題已經解決了,可是如果現在想要把剛才添加到資料庫中的元素讀取出來的話,會發現讀出的數據中每個預定義的字元前面都多了一個反斜杠,這時反斜杠並不是我們想要的,那麼有沒有辦法將每個預定義字元前面的反斜杠去掉呢?
php中也提供了具有該功能的函數:
函數原型為:
string stripslashes ( string $str );
函數返回值:返回一個去掉轉義反斜杠的字元串,即去掉addslashes()函數添加的字元串。
另外tp中自定義了一個函數:
function stripslashes_deep($value)
{
$value = is_array($value) ? array_map(‘stripslashes_deep’, $value) : stripslashes($value);
return $value;
}
這個函數也能去除預定義字元前的反斜杠。
現在還有一個問題:在訪問伺服器之前,我們並不知道「魔法開關」的狀態是打開還是關閉,如果已經處於打開狀態,再使用addslashes()函數進行轉義,就會使預定義前面有兩個反斜杠,從而使的寫入資料庫的數據發生改變。
解決辦法:
可以使用函數get_magic_quotes_gpc()進行檢驗「魔法開關」是否打開。
$data = get_magic_quotes_gpc() ? $data : addslashes($data);
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/273747.html