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

rin*_*ogo 39 php wordpress escaping

这是一个简单的问题,有一个奇怪的难以回答的答案.

get_magic_quotes_gpc()报告0.我重复一遍,魔术报价已关闭.魔术引号似乎已被禁用php.ini(不是在运行时).

然而,当在PHP中访问时,包括单引号(')的所有POST数据都被转义.可能是什么导致了这个?

谢谢.


编辑:对于好奇,这是我们的phpinfo的屏幕截图:http: //img843.imageshack.us/img843/6959/screenshot20120120at552.png


编辑:在准备测试用例时,我发现了问题的一般原因.当我们的应用程序与WP Multisite安装集成时,我们正在引导Wordpress.当我禁用Wordpress引导时,自动转义被禁用.有谁知道Wordpress的自动转义代码可能位于何处?

rin*_*ogo 39

我想我找到了.问题(错误):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);
Run Code Online (Sandbox Code Playgroud)

注意:正如@Alexandar O'Mara所建议的那样,您可能需要重新考虑覆盖这样的超级全局.例如,如果它适合您的情况,您可能只是使用其他方式"剥离本地"$post = array_map('stripslashes_deep', $_POST);

另见@ quickshiftin的优秀答案.

  • 感谢您分享有关这种ridiculuos wp行为的信息 (13认同)
  • **警告:**按原样使用此答案中的代码是一个潜在的安全漏洞.从WordPress票证中查看此报价."目前魔术引用*是必要的,因为删除它们可能很容易让我们接触到意想不到的安全漏洞.即使我们修复了所有核心内容,也可能会有数百个(保守估计)插件突然变得脆弱,因为它们正在假设大幅削减数据但事实并非如此." (7认同)
  • VilliusL,如果你有这个干扰其他插件的问题,请记住,你没有义务覆盖原来的超级全局(`$ _POST`,`$ _GET`等).你总是可以这样做:`$ post_copy = array_map('stripslashes_deep',$ _ POST);`(注意$ post_copy不是超全局的,所以你要使用`global $ post_copy;`或传递$ post_copy作为参数. (4认同)
  • 2年后,我们仍然有这个bug.请注意,您不能使用这几次,因此如果您使用它,其他插件使用它,结果将是不可预测的. (3认同)
  • 18322于2019年11月22日(也就是近8年后)重新开放。 (2认同)

qui*_*tin 15

通过更深入的解释扩展@ rinogo的答案,并提供另一种解决方法.


wp-settings.php中有一个无条件的调用wp_magic_quotes

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();
Run Code Online (Sandbox Code Playgroud)

Wordpress无论如何都会逃脱报价

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

有趣的是,这个调用是加载插件之后,加载主题之前进行的.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;
Run Code Online (Sandbox Code Playgroud)

然后你可以自由地使用$_REAL_POSTet代替$_POST(记住它是一个全局而不是超全局)你需要的地方.还要记住,当你的插件在主题之前加载时,如果主题调用其中一个使用的插件函数$_POST,它应该读取$_REAL_POST以获取未转义的值.

  • @adamj这将破坏依赖于它们被逃脱的Wordpress代码。这不是一个好主意。 (2认同)
  • 感谢您的wp-settings解决方案,wordpress和CI集成在一起时出现了问题,wordpress甚至可以修改CI中的所有发布数据。 (2认同)