禁用“魔术引号”后,为什么PHP / WordPress继续自动转义我的POST数据?

2022-08-30 11:10:47

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

get_magic_quotes_gpc()报告 0。我再说一遍,魔术引号是关闭的。魔术引号似乎已在中禁用(而不是在运行时)。php.ini

但是,在 PHP 中访问所有 POST 数据(包括单引号 ('))时都会被转义。可能导致这种情况的原因是什么?


在准备测试用例时,我发现了问题的一般根源。我们正在引导WordPress,因为我们的应用程序与WordPress多站点安装集成。当我禁用WordPress引导时,自动转义被禁用。WordPress的自动转义码可能位于何处?


答案 1

我想我找到了。问题(错误):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所建议的那样,您可能需要重新考虑覆盖这样的超级全球。例如,如果它适合您的情况,您可以直接使用以下替代方法“在本地剥离”$post = array_map('stripslashes_deep', $_POST);

另请参阅@quickshiftin的出色答案。


答案 2

通过更深入的解释来扩展@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.
}

有趣的是,此调用是在加载插件之后,在加载主题之前进行的。所以,在你的插件的顶部

// 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


推荐