在一個項目中,魔術引號若是開啟的話,所有的反斜線(\)、單引號(')、雙引號(")、NULL 字元都會被自動加上一個反斜線進行轉義,這和 addslashes() 作用完全相同。 這裡主要講四個與之相關的函數:set_magic_quotes_runtime、magic_quotes_gpc、addslashes、stripslashes。
set_magic_quotes_runtime(),設定當前magic_quotes_runtime 配置選項的啟用狀態,0為關閉,1為開啟。啥意思呢。這樣理解,如是set_magic_quotes_runtime(1)或是設定檔中magic_quotes_runtime為true(這個在php.ini中配置),那麼php指令碼讀取檔案或是從資料庫中讀取資料,遇到反斜線(\)、單引號(')、雙引號(")、NULL時,會在前面自動加上逸出字元,變成\\、\'、\”、\NULL;若是關閉的話,也就是set_magic_quotes_runtime(0)magic_quotes_runtime為false,那麼便會轉義,此時可以藉助addslashes進行轉義。
magic_quotes_gpc(),當此值為1時,會對HTTP請求中的G($_GET)、P($_POST)、C($_COOKIE)單雙引號和反斜線進行轉義;反之則不會。該操作一般見於表單提交的資料庫操作,若是值為0時,便用addslashes進行轉義存入資料庫中,取出時再用stripslashes函數把反斜線給去掉。
特別注意的是在PHP 5.4版本時,魔術引號被移除了,因此轉義都需要加上addslashes函數。
$_GET['des'] = "she's a beauty";foreach (array('_GET', '_POST', '_COOKIE') as $_request){ echo $_request; // _GET_POST _COOKIE foreach ($$_request as $_key=> $_value){ // $_key為鍵,如_GET,$$_key為$_GET // $$_key=$_value意思就是把$_GET['des'] = 1111便為$des=she\'s a beauty $_key{0} != '_' && $$_key=addslashes($_value); echo $$_key; }}
看看上面代碼能夠理解不,這是摘自我晚上看的關於介紹discuz中源碼分析的書,$$_key是否有點繞,應該不會的,就是變數多重引用,可以看看我的 php變數的幾種寫法部落格,上述代碼就是過濾惡意偽造GPC請求預定義變數行為。