WordPress和魔术引号


12

我一直在写一些Wordpress插件,而Wordpress在将魔术引号放在POST和GET数据上时遇到了一些问题。

具体来说,\ wp-includes \ load.php中的“ wp_magic_quotes”函数在wp-settings.php中被调用(大概在每个响应中)。即使我在PHP设置中关闭了魔术引号,此函数也会在数据中添加魔术引号。

/**
 * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 *
 * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE,
 * or $_ENV are needed, use those superglobals directly.
 *
 * @access private
 * @since 3.0.0
 */
function wp_magic_quotes() {
    // If already slashed, strip.
    if ( get_magic_quotes_gpc() ) {
        $_GET    = stripslashes_deep( $_GET    );
        $_POST   = stripslashes_deep( $_POST   );
        $_COOKIE = stripslashes_deep( $_COOKIE );
    }

    // Escape with wpdb.
    $_GET    = add_magic_quotes( $_GET    );
    $_POST   = add_magic_quotes( $_POST   );
    $_COOKIE = add_magic_quotes( $_COOKIE );
    $_SERVER = add_magic_quotes( $_SERVER );

    // Force REQUEST to be GET + POST.
    $_REQUEST = array_merge( $_GET, $_POST );
}

对我来说,只注释掉wp-settings.php中的wp_magic_quotes()调用安全吗?也就是说,它会对正常的Wordpress代码产生负面影响和/或开放某些利用媒介吗?如果是这样,除了修改WP代码之外,还有其他方法可以做到这一点(因此,我不必每次更新时都进行处理)吗?


谁能告诉我函数在哪里/何时wp_magic_quotes()执行?我在wp-core中找不到执行。
T.Todua '18


此问题在超过8年后的2019年仍然存在(例如,PHP 7.1.33(2019-10-23)和WordPress 5.2.4(2019-10-14))。
彼得·莫滕森

Answers:


8

只需简单地将WP将不确定的情况(在服务器配置中可能启用或不启用魔术引号)变成确定(魔术引号始终存在并且服务器配置无关紧要)。

与其在所有WP内核上都弄乱它,不如在需要的时候简单地在自己的变量上去除代码中的斜杠是更有意义的。


7
如果可以的话,这太疯狂了。任何理智的编码人员都认为魔术引号是不好的,这对Wordpress来说是一个不负责任的选择。并非令我感到惊讶。
o0'。

5
@Lohoris注意WP不仅在此刻存在。它存在多年了。如果魔术引号天生就是个坏主意,那么它们根本就不会存在。虽然时代在变化,但现在很容易大喊它现在是多么糟糕的想法-更改代码库中的现有行为会带来巨大的安全性和向后兼容性。
腊斯特2014年

3

WordPress中的当前行为是基于所有PHP系统和配置的兼容性的最佳实践。WordPress始终将要削减的$ _GET,$ _ POST,$ _ COOKIE和$ _SERVER进行了规范化,并希望它会继续这样做。

因此,要提取POST或GET参数,我们必须编写:

$value = stripslashes_deep($_POST['name']); 要么

$value = stripslashes_deep($_GET['name']);


0

我在Stack Overflow中的类似问题中写了一个解决这些超全局数组的解决方案。

它包括为每个超全局变量编写一个单一的“访问器方法”(获取/设置),并以斜杠和透明方式进行剥离。因此,您将使用例如:

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

这样,您就可以避免进一步与超全局变量混淆,并享受可以在您的代码“本地”工作且没有任何副作用的解决方案。对我来说,这是最终的解决方案。


-3

我最近遇到了这个问题,终于找到了答案。基本上,我几乎在每个网站上搜索WordPress上的魔术引号,但没有一个有帮助。

这是解决方法:

  1. 进入您的wp-settings.php

  2. 搜索wp_magic_quotes();

  3. 只需将其注释掉即可,现在应该可以使用

这行得通,因为如果您查看该代码之前会看到:

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in //wp-settings.php.

@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

后来在使用wpdb时添加的Magic引用使大多数人感到困惑,它恰好是wp_magic_quotes()。只需评论一下,即可防止魔术引号将您弄乱。


6
坏主意:下次升级后,此更改将丢失。
fuxia

尽管这不是一个好主意,但这是我发现可以同时运行WordPress和Magento的唯一解决方案,在保存内容时不会出现Magento问题。
forsvunnet 2015年

1
这也是一个坏主意,因为许多插件的编写错误,并且无法正确地逃避SQL,因此您的站点可能容易受到SQL注入攻击的攻击。任何通过在$ _GET / $ _ POST上运行stripslashes / stripslashes_deep来做正确的事情的插件都将通过删除反斜杠来破坏用户输入。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.