問題描述

這是一個簡單的問題,奇怪的是難以捉摸的答案。

get_magic_quotes_gpc()報告 0. 我重複,魔術報價關閉。魔術報價似乎已被禁用在 php.ini(不在運行時) 。

然而,在 PHP 中訪問時,包括單引號 (‘) 的所有 POST 數據都將被轉義。可能是什麼原因造成的?

謝謝。


編輯:對於好奇,這是我們的 phpinfo 的屏幕截圖:http://img843.imageshack.us/img843/6959/screenshot20120120at552.png


編輯:在準備測試用例時,我發現問題的一般起因。我們正在引導 Wordpress,因為我們的應用程序與 WP Multisite 安裝集成。當我禁用 Wordpress 自舉時,auto-escaping 被禁用。有誰知道 Wordpress 的 auto-escape 代碼可能位於哪裏?

最佳解決思路

我想我找到了問題 (bug):http://core.trac.wordpress.org/ticket/18322

解決方案:http://codex.wordpress.org/Function_Reference/stripslashes_deep

    $_GET       = array_map('stripslashes_deep', $_GET);
    $_POST      = array_map('stripslashes_deep', $_POST);
    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
    $_SERVER    = array_map('stripslashes_deep', $_SERVER);
    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);

注意:根據 @Alexandar O’Mara 的建議,您可能需要重新考慮覆蓋超級桌面。如果適合您的情況,例如,您可能只是使用”strip locally”,如 $post = array_map('stripslashes_deep', $_POST);

另請參閲 @ quickshiftin 的出色答案。

次佳解決思路

擴大 @ rinogo 的答案,深入解釋,並提供另一種解決方法。


在 wp-settings.php 中有一個無條件調用 wp_magic_quotes

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

無論什麼,Wordpress 都可以轉載

function wp_magic_quotes() {
    // If already slashed, strip.
    // Escape with wpdb.
    // Force REQUEST to be GET + POST.
}

有趣的是,這個調用是在加載插件之後完成的。 Sooo,在你的插件的頂部

// A hack to cope with un-configurable call to wp_magic_quotes
// E.G. Make the original $_POST available through a global $_REAL_POST
$_REAL_GET     = $_GET;
$_REAL_POST    = $_POST;
$_REAL_COOKIE  = $_COOKIE;
$_REAL_REQUEST = $_REQUEST;

那麼你可以自由地使用 $_REAL_POST 等代替 $_POST(記住它是一個全球性的,不是超級全局的),你需要。還要記住,當你的插件在主題之前加載,如果主題調用到使用 $_POST 的插件函數之一,它應該從 $_REAL_POST 讀取以獲取未轉義的值。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。