PHP禁止頁面緩存輸出
對(duì)于 Magic quotes,對(duì)于 PHPer 而言是個(gè)老生常談的問題。今天無意間看到篇文章,結(jié)合PHP Manual以及其回復(fù),在這里做個(gè)簡(jiǎn)單的匯總。
簡(jiǎn)而言之,Magic quotes 開啟后會(huì)自動(dòng)轉(zhuǎn)義輸入的數(shù)據(jù)。其中,所有的單引號(hào)(')、雙引號(hào)(')、反斜線、和 NULL 字符都會(huì)被轉(zhuǎn)義(增加個(gè)反斜線),其實(shí)這操作本質(zhì)上調(diào)用的是 addslashes 函數(shù)。
為什么使用 Magic quotes方便快捷PHP 的設(shè)計(jì)者在設(shè)計(jì)之初的構(gòu)想就是能夠快速方便的編程。例如插入數(shù)據(jù)庫時(shí),Magic quotes 會(huì)自動(dòng)將數(shù)據(jù)轉(zhuǎn)義,這很方便。
對(duì)初學(xué)者有利Magic quotes 可以從一定程度上,讓初學(xué)者帶離腳本的安全風(fēng)險(xiǎn)。例如在沒有任何保護(hù)措施的代碼下,開啟了 Magic quotes 后會(huì)少很多的風(fēng)險(xiǎn),例如注入問題。當(dāng)然,單一使用此方法,并不能完全阻止此類安全問題。
“我沒有權(quán)限去關(guān)閉”很顯然你已經(jīng)可能意識(shí)到了這個(gè)問題,但是主機(jī)空間并非完全由自己控制。
為什么不使用 Magic quotes可移植性無論此功能是否開啟,它都會(huì)影響腳本的可移植性,因?yàn)樗绊懳覀兒罄m(xù)過濾數(shù)據(jù)的操作。
性能問題在獲取所有的外部數(shù)據(jù)之前都會(huì)被轉(zhuǎn)義,這無疑會(huì)增加運(yùn)行時(shí)的花銷(而且并不是所有的數(shù)據(jù)都需要轉(zhuǎn)義)。
造成困惑正如上述所言,并非所有的數(shù)據(jù)都需要被轉(zhuǎn)義。有可能出現(xiàn)的一種情況,就是當(dāng)你為了獲取未被轉(zhuǎn)義的數(shù)據(jù),而“瘋狂的”使用 stripslashes 函數(shù)。
PHP6 已經(jīng)不支持PHP 的設(shè)計(jì)者顯然已經(jīng)意識(shí)到了自己的“錯(cuò)誤”,所以在 PHP6 中已經(jīng)將其廢棄。
如何禁用 Magic quotes按照本人觀點(diǎn),使用 php.ini 配置文件全局禁用 Magic quotes 是最靠譜的。參考下面的代碼
Magic quotesMagic 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然而線上的主機(jī)可能無法讓你修改 php.ini 文件,那么可以使用 .htaccess 文件禁用,加入下面的代碼
php_flag magic_quotes_gpc Off上述可移植的代碼而言,無論是否禁用 magic_quotes,數(shù)據(jù)必須保持一致。那么下面的代碼可以幫助您
<?phpif (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);}
