问题描述
这是一个简单的问题,奇怪的是难以捉摸的答案。
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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。