在帝國CMS后臺總覽頁面中的“服務器信息”一欄中,有一個“魔術引用”狀態(tài),如下圖所示:
1.開啟方法
在php系統(tǒng)配置文件php.ini中找到magic_quotes_gpc變量,將其值設置為on即可。
網(wǎng)上有很多人反映找不到php.ini文件。此文件屬于php的系統(tǒng)配置文件,它在php系統(tǒng)的安裝目錄中,而不是在帝國CMS的安裝目錄中,默認下是在…phpphp5文件夾中。如果你的網(wǎng)站系統(tǒng)是自己搭建的,可以直接更改這個文件。如果你使用的是其它供應商提供的虛擬主機,一般說來沒有這個文件的讀寫權力,此變量的值是不可更改的。從下面的介紹中你可以看出此變量是php為了方便程序的編寫和數(shù)據(jù)的輸入而設置的一個變量,它對網(wǎng)站的使用和安全性并沒有太大影響。
2.魔術引用簡介
在php.ini文件中對magic_quotes_gpc的官方解釋是: “Input data is no longer escaped with slashes so that it can be sent into SQL databases without further manipulation. Instead, you should use the function addslashes() on each input element you wish to send to a database.”也就是當開啟魔術引用時,會對進入服務器的get/post/cookie數(shù)據(jù)做自動轉換。
2.1 addslashes函數(shù)
為了更深刻地了解魔術引用,先介紹php的addslashes函數(shù)。
該函數(shù)返回字符串,該字符串為了數(shù)據(jù)庫查詢語句等的需要在某些字符前加上了反斜線。這些字符是單引號(')、雙引號(")、反斜線()與 NUL(NULL 字符)。
一個使用 addslashes() 的例子是當你要往數(shù)據(jù)庫中輸入數(shù)據(jù)時。例如,將名字 O'reilly 插入到數(shù)據(jù)庫中,這就需要對其進行轉義。大多數(shù)據(jù)庫使用 作為轉義符:O'reilly。這樣可以將數(shù)據(jù)放入數(shù)據(jù)庫中,而不會插入額外的 。當 PHP 指令 magic_quotes_sybase 被設置成 on 時,意味著插入 O'reilly字符串時,無需使用對’進行轉義,php將自動為你進行轉義。
默認情況下,PHP 指令 magic_quotes_gpc 為 on,它主要是對所有的 GET、POST 和COOKIE 數(shù)據(jù)自動運行 addslashes()。不要對已經(jīng)被 magic_quotes_gpc 轉義過的字符串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數(shù)get_magic_quotes_gpc() 進行檢測。
例如,如下語句:
<?php
$str = "Is your name O'reilly?";
echo addslashes($str);
?>
將在網(wǎng)頁上顯示字符串Is your name O'reilly?
2.2 魔術引用magic_quotes_gpc
當開啟了魔術引用時,也就相當于系統(tǒng)自帶對你存入數(shù)據(jù)庫的字符串執(zhí)行addslashes()操作。例如,當向數(shù)據(jù)庫加入I'm Androidyue時,它會自動將字符串轉變?yōu)镮'mandroidyue。當然了,如果我們在php文件利用諸如$name=$_REQUEST['name'];這種語句來獲取字符串時,執(zhí)行輸出得到的結果也會是I'm androidyue。這當然不是我們想要的結果,如果想去掉反斜杠,可以使用stripslashes()函數(shù),此函數(shù)和addslashes()函數(shù)執(zhí)行相反的操作。如$name=stripslashes($name);這樣我們再執(zhí)行輸出時得到的會是正常的字符串I'm androidyue。