對於 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, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of ').
magic_quotes_sybase = Off
然而線上的主機可能無法讓你修改 php.ini 文件,那麼可以使用 .htaccess 文件禁用,加入下面的代碼
php_flag magic_quotes_gpc Off上述可移植的代碼而言,無論是否禁用 magic_quotes,數據必須保持一致。那麼下面的代碼可以幫助您
<?php
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value) {$value = is_array(
$value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_GET = array_map('stripslashes_deep', $_GET);
$_POST = array_map('stripslashes_deep', $_POST);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}