對於Magic quotes,對於PHPer 而言是個老生常談的問題。今天無意間看到篇文章,結合PHP Manual以及其回复,在這裡做個簡單的總結。
簡而言之,Magic quotes 開啟後會自動轉義輸入的資料。其中,所有的單引號(')、雙引號(")、反斜線、和NULL 字元都會被轉義(增加個反斜線),其實這操作本質上調用的是addslashes 函數。
為什麼使用Magic quotes
方便快速
PHP 的設計者在設計之初的構想就是能夠快速方便的程式設計。例如插入資料庫時,Magic quotes 會自動將資料轉義,這很方便。
對初學者有利
Magic quotes 可以從一定程度上,讓初學者帶離腳本的安全風險。例如在沒有任何保護措施的程式碼下,開啟了Magic quotes 後會少很多的風險,例如注入問題。當然,單一使用此方法,並不能完全阻止此類安全性問題。
“我沒有權限去關閉”
很顯然你已經可能意識到了這個問題,但是主機空間並非完全由自己控制。
為什麼不使用Magic quotes
可攜性無論此功能是否開啟,它都會影響腳本的可攜性,因為它會影響我們後續過濾資料的操作。
效能問題在取得所有的外部資料之前都會被轉義,這無疑會增加運行時的花銷(而且並不是所有的資料都需要轉義)。
造成困惑正如上述所言,並非所有的數據都需要被轉義。有可能出現的一種情況,就是當你為了獲取未被轉義的數據,而「瘋狂的」使用stripslashes 函數。
PHP6 已經不支援
PHP 的設計者顯然已經意識到了自己的“錯誤”,所以在PHP6 中已經將其廢棄。
如何禁用Magic quotes
依照本人觀點,使用php.ini 設定檔全域禁用Magic quotes 是最可靠的。參考下面的程式碼
; Magic quotes;; Magic quotes for incoming GET/POST/Cookie data.magic_quotes_gpc = Off; Magic quotes for runtime-generated data, eg data from SQL, from exec(), etc.magic_quotes_runtime = Offbase; -style magic quotes (escape ' with '' instead of ').magic_quotes_sybase = Off然而線上的主機可能無法讓你修改php.ini 文件,那麼可以使用.htaccess 文件禁用,加入下面的代碼
php_flag magic_quotes_gpc Off上述可移植的程式碼而言,無論是否停用magic_quotes,資料必須保持一致。那麼下面的程式碼可以幫助您
<?phpif (get_magic_quotes_gpc()) {function stripslashes_deep($value) {$value = is_array($value) ?array_map('stripslashes_deep', $value) :stripslashes($value);return $value value;}$_GET = array_map('stripslashes_deep', $_GET);$_POST = array_map('stripslashes_deep', $_POST);$_COOKIE = array_map('stripslashes_deep', $_COOKIE); , $_REQUEST);}