问题描述

这是一个简单的问题,奇怪的是难以捉摸的答案。

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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。