基於magic_quotes_gpc與magic_quotes_runtime的區別與使用介紹_PHP教程

來源:互聯網
上載者:User
當你的資料中有一些 \ ” ‘
這樣的字元要寫入到資料庫裡面,又想不被過濾掉的時候,它就很有用,會在這些字元前自動加上\,如
中國\地大物博”哈哈”
中國\\地大物博\”哈哈\”
可以使用set_maginc_quotes_runtime(0)關閉掉,當然你也可以直接在php.ini中設定。
get_magic_quotes_runtime() 取得 PHP 環境變數 magic_quotes_runtime 的值。

magic_quotes_gpc 為 on,它主要是對所有的 GET、POST 和 COOKIE 資料自動運行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。

兩者不同

set_magic_quotes_runtime() 可以讓程式員在代碼中動態開啟或關閉 magic_quotes_runtime,
set_magic_quotes_runtime(1) 表示開啟,set_magic_quotes_runtime(0) 則表示關閉。當set_magic_quotes_runtime(1) 時,從資料庫或通過fread之類的函數讀取的文本,將自動對' “和\自動加上反斜線\進行轉義,防止溢出。這在對資料庫的資料進行轉移的時候非常有用。但在一般情況下,應當將其關閉,否則從資料庫讀取出來的資料單引號、雙引號和反斜線都會被加上\,導致顯示不正常。像Discuz,PHPWind都在公用檔案的頭部加上一句 set_magic_quotes_runtime(0); 強制關閉 magic_quotes_runtime 。

magic_quotes_gpc

作用範圍是:WEB客戶服務端;
作用時間:請求開始是,例如當指令碼運行時.

magic_quotes_runtime

作用範圍:從檔案中讀取的資料或執行exec()的結果或是從SQL查詢中得到的;
作用時間:每次當指令碼訪問運行狀態中產生的資料.

所以

magic_quotes_gpc的設定值將會影響通過Get/Post/Cookies獲得的資料,
magic_quotes_runtime的設定值將會影響從檔案中讀取的資料或從資料庫查詢得到的資料,
magic_quotes_gpc 是對通過GET、POST、COOKIE傳遞的資料進行轉義,一般在資料入庫前要先進行轉義,
magic_quotes_gpc不能在代碼中動態開啟或關閉,需要到php.ini將magic_quotes_gpc設定為on或off,
代碼中可以用get_magic_quotes_gpc擷取magic_quotes_gpc的狀態。
當magic_quotes_gpc為off時,需要手工對資料進行addslashes,代碼如下:
複製代碼 代碼如下:
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;
}

另一樣本:
複製代碼 代碼如下:
$data1 = $_POST['aaa'];
$data2 = implode(file('1.txt'));

if (get_magic_quotes_gpc()) {
//把資料$data1直接寫入資料庫
} else {
$data1 = addslashes($data1);
//把資料$data1寫入資料庫
}

if (get_magic_quotes_runtime()){
//把資料$data2直接寫入資料庫
//從資料庫讀出的資料要經過一次stripslashes()之後輸出
} else {
$data2 = addslashes($data2);
//把資料$data2寫入資料庫
//從資料庫讀出的資料直接輸出
}

++++++++++++++++++++++++++++++++++++++++++++++++++++++

經驗總結:

一、對於GPC,不管系統有沒有開啟magic_quotes_gpc(即php.ini中magic_quotes_gpc = On),我們統一開啟 magic_quotes_gpc,對get、post、cookie的內容進行轉義。操作如下:
(摘自uchome系統)
複製代碼 代碼如下:
function saddslashes($string) {
if (is_array($string)) {
foreach ($string as $key => $val) {
$string[$key] = saddslashes($val);
}
} else {
$string = addslashes($string);
}
return $string;
}

//GPC過濾
$magic_quote = get_magic_quotes_gpc();
if(empty($magic_quote)) {
$_GET = saddslashes($_GET);
$_POST = saddslashes($_POST);
}

//COOKIE,給cookie值轉義
$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;
}
}

二、對於magic_quotes_runtime,我們統一關閉它,即set_magic_quotes_runtime(0);不讓從資料庫讀取出來的資料的單引號、雙引號和反斜線都自動被加上\。這樣,對資料庫的操作如下:添加資料到資料庫之前,我們手動對資料進行addslashes(),而從資料庫取出資料時,則作相反操作,即stripslashes()。

三、對於要序列化的內容,要保持裸資料,即要去掉轉義,stripslashes(),然後在把序列化過的內容儲存到資料庫當中(注意,序列化過的內容是不帶單引號(')、雙引號(”)、反斜線(\)的),樣本如下:
$feedarr['body_data'] = serialize(stripslashes($body_data));

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

出現Function set_magic_quotes_runtime() is deprecated 問題?

在安裝PHPCMS出現Deprecated: Function set_magic_quotes_runtime() is deprecated 錯誤,查了一下網路及資料發現是PHP5.3和PHP6.0之後移除了set_magic_quotes_runtime()函數。
我可以使用如下方案替代:

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);
}

http://www.bkjia.com/PHPjc/326823.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/326823.htmlTechArticle當你的資料中有一些 \ ” ‘ 這樣的字元要寫入到資料庫裡面,又想不被過濾掉的時候,它就很有用,會在這些字元前自動加上\,如 中國...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.