當(dāng)你的數(shù)據(jù)中有一些 / ” ‘
這樣的字符要寫(xiě)入到數(shù)據(jù)庫(kù)里面,又想不被過(guò)濾掉的時(shí)候,它就很有用,會(huì)在這些字符前自動(dòng)加上/,如
中國(guó)/地大物博”哈哈”
中國(guó)//地大物博/”哈哈/”
可以使用set_maginc_quotes_runtime(0)關(guān)閉掉,當(dāng)然你也可以直接在php.ini中設(shè)置。
get_magic_quotes_runtime() 取得 php 環(huán)境變量 magic_quotes_runtime 的值。
magic_quotes_gpc 為 on,它主要是對(duì)所有的 GET、POST 和 COOKIE 數(shù)據(jù)自動(dòng)運(yùn)行 addslashes()。不要對(duì)已經(jīng)被 magic_quotes_gpc 轉(zhuǎn)義過(guò)的字符串使用 addslashes(),因?yàn)檫@樣會(huì)導(dǎo)致雙層轉(zhuǎn)義。遇到這種情況時(shí)可以使用函數(shù) get_magic_quotes_gpc() 進(jìn)行檢測(cè)。
兩者不同
set_magic_quotes_runtime() 可以讓程序員在代碼中動(dòng)態(tài)開(kāi)啟或關(guān)閉 magic_quotes_runtime,
set_magic_quotes_runtime(1) 表示開(kāi)啟,set_magic_quotes_runtime(0) 則表示關(guān)閉。當(dāng)set_magic_quotes_runtime(1) 時(shí),從數(shù)據(jù)庫(kù)或通過(guò)fread之類(lèi)的函數(shù)讀取的文本,將自動(dòng)對(duì)' “和/自動(dòng)加上反斜杠/進(jìn)行轉(zhuǎn)義,防止溢出。這在對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行轉(zhuǎn)移的時(shí)候非常有用。但在一般情況下,應(yīng)當(dāng)將其關(guān)閉,否則從數(shù)據(jù)庫(kù)讀取出來(lái)的數(shù)據(jù)單引號(hào)、雙引號(hào)和反斜杠都會(huì)被加上/,導(dǎo)致顯示不正常。像Discuz,phpWind都在公共文件的頭部加上一句 set_magic_quotes_runtime(0); 強(qiáng)制關(guān)閉 magic_quotes_runtime 。
magic_quotes_gpc
作用范圍是:WEB客戶服務(wù)端;
作用時(shí)間:請(qǐng)求開(kāi)始是,例如當(dāng)腳本運(yùn)行時(shí).
magic_quotes_runtime
作用范圍:從文件中讀取的數(shù)據(jù)或執(zhí)行exec()的結(jié)果或是從SQL查詢中得到的;
作用時(shí)間:每次當(dāng)腳本訪問(wèn)運(yùn)行狀態(tài)中產(chǎn)生的數(shù)據(jù).
所以
magic_quotes_gpc的設(shè)定值將會(huì)影響通過(guò)Get/Post/Cookies獲得的數(shù)據(jù),
magic_quotes_runtime的設(shè)定值將會(huì)影響從文件中讀取的數(shù)據(jù)或從數(shù)據(jù)庫(kù)查詢得到的數(shù)據(jù),
magic_quotes_gpc 是對(duì)通過(guò)GET、POST、COOKIE傳遞的數(shù)據(jù)進(jìn)行轉(zhuǎn)義,一般在數(shù)據(jù)入庫(kù)前要先進(jìn)行轉(zhuǎn)義,
magic_quotes_gpc不能在代碼中動(dòng)態(tài)開(kāi)啟或關(guān)閉,需要到php.ini將magic_quotes_gpc設(shè)置為on或off,
代碼中可以用get_magic_quotes_gpc獲取magic_quotes_gpc的狀態(tài)。
當(dāng)magic_quotes_gpc為off時(shí),需要手工對(duì)數(shù)據(jù)進(jìn)行addslashes,代碼如下:
復(fù)制代碼 代碼如下:
if (!get_magic_quotes_gpc()) {
new_addslashes($_GET);
new_addslashes($_POST);
new_addslashes($_COOKIE);
}
function new_addslashes($string) {
if (is_array($string)) {
foreach ($string as $key => $value) {
$string[$key] = new_addslashes($value);
}
} else {
$string = addslashes($string);
}
return $string;
}
另一示例:
復(fù)制代碼 代碼如下:
$data1 = $_POST['aaa'];
$data2 = implode(file('1.txt'));
if (get_magic_quotes_gpc()) {
//把數(shù)據(jù)$data1直接寫(xiě)入數(shù)據(jù)庫(kù)
} else {
$data1 = addslashes($data1);
//把數(shù)據(jù)$data1寫(xiě)入數(shù)據(jù)庫(kù)
}
if (get_magic_quotes_runtime()){
//把數(shù)據(jù)$data2直接寫(xiě)入數(shù)據(jù)庫(kù)
//從數(shù)據(jù)庫(kù)讀出的數(shù)據(jù)要經(jīng)過(guò)一次stripslashes()之后輸出
} else {
$data2 = addslashes($data2);
//把數(shù)據(jù)$data2寫(xiě)入數(shù)據(jù)庫(kù)
//從數(shù)據(jù)庫(kù)讀出的數(shù)據(jù)直接輸出
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++
經(jīng)驗(yàn)總結(jié):
一、對(duì)于GPC,不管系統(tǒng)有沒(méi)有開(kāi)啟magic_quotes_gpc(即php.ini中magic_quotes_gpc = On),我們統(tǒng)一開(kāi)啟 magic_quotes_gpc,對(duì)get、post、cookie的內(nèi)容進(jìn)行轉(zhuǎn)義。操作如下:
(摘自u(píng)chome系統(tǒng))
復(fù)制代碼 代碼如下:
function saddslashes($string) {
if (is_array($string)) {
foreach ($string as $key => $val) {
$string[$key] = saddslashes($val);
}
} else {
$string = addslashes($string);
}
return $string;
}
//GPC過(guò)濾
$magic_quote = get_magic_quotes_gpc();
if(empty($magic_quote)) {
$_GET = saddslashes($_GET);
$_POST = saddslashes($_POST);
}
//COOKIE,給cookie值轉(zhuǎn)義
$prelength = strlen($_SC['cookiepre']);
foreach ($_COOKIE as $key => $val) {
if(substr($key, 0, $prelength) == $_SC['cookiepre']) {
$_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val;
}
}
二、對(duì)于magic_quotes_runtime,我們統(tǒng)一關(guān)閉它,即set_magic_quotes_runtime(0);不讓從數(shù)據(jù)庫(kù)讀取出來(lái)的數(shù)據(jù)的單引號(hào)、雙引號(hào)和反斜杠都自動(dòng)被加上/。這樣,對(duì)數(shù)據(jù)庫(kù)的操作如下:添加數(shù)據(jù)到數(shù)據(jù)庫(kù)之前,我們手動(dòng)對(duì)數(shù)據(jù)進(jìn)行addslashes(),而從數(shù)據(jù)庫(kù)取出數(shù)據(jù)時(shí),則作相反操作,即stripslashes()。
三、對(duì)于要序列化的內(nèi)容,要保持裸數(shù)據(jù),即要去掉轉(zhuǎn)義,stripslashes(),然后在把序列化過(guò)的內(nèi)容保存到數(shù)據(jù)庫(kù)當(dāng)中(注意,序列化過(guò)的內(nèi)容是不帶單引號(hào)(')、雙引號(hào)(”)、反斜線(/)的),示例如下:
$feedarr['body_data'] = serialize(stripslashes($body_data));
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
出現(xiàn)Function set_magic_quotes_runtime() is deprecated 問(wèn)題?
在安裝phpCMS出現(xiàn)Deprecated: Function set_magic_quotes_runtime() is deprecated 錯(cuò)誤,查了一下網(wǎng)絡(luò)及資料發(fā)現(xiàn)是php5.3和php6.0之后移除了set_magic_quotes_runtime()函數(shù)。
我可以使用如下方案替代:
view sourceprint?
@set_magic_quotes_runtime(0);
或
view sourceprint?
ini_set("magic_quotes_runtime", 0);
或
view sourceprint?
if (phpversion() < '5.3.0') {
set_magic_quotes_runtime(0);
}
php技術(shù):基于magic_quotes_gpc與magic_quotes_runtime的區(qū)別與使用介紹,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。