Php 为什么WordPress仍然使用addslashes()、register_globals()和magic_引号?

Php 为什么WordPress仍然使用addslashes()、register_globals()和magic_引号?,php,security,wordpress,escaping,global-variables,Php,Security,Wordpress,Escaping,Global Variables,为了在Wordpress中获得更多的经验,我深入研究了它的代码库,研究了它的内部工作和工作流程,当我看到以下内容时,我非常惊讶: 它们实现register_globals(摘自wp includes/class wp.php): 它们依赖于magic quotes(从wp includes/functions.php执行)。magic_quotes_gpc在启动时关闭,然后再调用此函数): 它们依赖于addslashes(但自2.8.0以来,它们还引入了mysql\u real\u esca

为了在Wordpress中获得更多的经验,我深入研究了它的代码库,研究了它的内部工作和工作流程,当我看到以下内容时,我非常惊讶:

  • 它们实现register_globals(摘自wp includes/class wp.php):

  • 它们依赖于magic quotes(从wp includes/functions.php执行)。magic_quotes_gpc在启动时关闭,然后再调用此函数):

  • 它们依赖于addslashes(但自2.8.0以来,它们还引入了mysql\u real\u escape\u string,但使用
    addslashes()
    弱\u escape()函数仍然存在于wpdb类中)
    更新:我看到他们通过使用
    sprintf()
    和自定义placedholder来模拟准备好的语句,所以我认为查询应该是安全的。尽管如此,我还是对他们为什么不至少提供mysqli感到困惑,毕竟Mysql和PHP版本的检测是在启动序列的早期进行的
  • 现在,从长达一年的频繁访问中,我学到了很多东西,特别是上面的三个功能都是“不推荐的”和显示安全问题,并且被许多人惊恐地注视着

    但WP必须有使用它们的理由。我想从经验丰富的程序员那里了解一下是否真的存在安全问题,或者有时他们的使用是否被谣言和虚假的说服所蒙蔽。我知道magic_quotes是过去的传统,addslashes也是如此(至少在用于数据库时是如此),但在问这个问题之前,我在谷歌上发现许多网站都在谈论使用addslashes()而不是mysql_real_escape_string()

    我很想知道为什么会使用那些描述糟糕的函数的一个清晰、详细的原因;Wordpress在过去的几年中有了许多改进,解决了不同的方面,但这些功能仍然在使用;因此,我期待着对积极方面的具体解释,以某种方式覆盖消极方面,并证明这些功能的使用是合理的

    我不是在寻找意见(我完全知道它们不在这里),也不是在咆哮Wordpress,我希望这是清楚的。我只是想知道为什么许多PHP程序员认为这些功能“坏”,但是像WordPress这样的世界性的巨头,现在在第三版本中,仍然使用它们。p>
    这是为了与不同的服务器和php版本兼容吗?(不过,他们很早就检查了这些功能)。
    我是否遗漏了这些功能,它们在wordpress这样的环境中(或在一般情况下)有多重要?老实说,我很困惑。

    没有比参考以下PHP文档更好的方法来回答它们为什么不好:

    另请注意:

    从PHP 5.3.0开始,此功能已被弃用。非常不鼓励依赖此功能


    那么为什么Wordpress仍然使用魔法引号呢?

    使用PHP4.3。是的,这绝对是一个向后兼容的原因

    其他功能如何?


    老实说,我不确定。依靠超级环球是一个非常糟糕的主意。这就是Wordpress开发团队的懒惰。也许他们还有更重要的问题要解决

    魔术语录

    以下文本取自PHP.net

    没有理由使用魔法引号,因为它们不再是PHP支持的一部分。然而,它们确实存在,并且在不知不觉中帮助了一些初学者编写更好(更安全)的代码。但是,当处理依赖于此行为的代码时,最好更新代码,而不是打开神奇的引号。那么,为什么会存在这种特性呢?简单,有助于防止SQL注入。如今,开发人员对安全性有了更好的认识,并最终使用特定于数据库的转义机制和/或准备好的语句,而不是依赖于神奇的引号之类的功能

    addslashes()与mysql\u real\u escape\u string()

    之所以应该使用
    mysql\u real\u escape\u string()
    ,是因为它是一个“mysql函数”,创建它是为了在mysql查询中执行之前转义用户输入,而
    addslashes()
    是一个“PHP函数”。这听起来可能有点奇怪,但两者之间有一个重要区别,这与单字节和多字节字符的使用有关。您仍然可以注入受addslashes函数保护的数据库,但是注入受mysql\u real\u escape\u string保护的数据库要困难得多。你可以阅读更多关于它的内容

    注册全局文件

    不应使用
    register\u globals
    的原因是每个人都可以访问变量,这意味着在下面的示例中,如果$access之前没有初始化过,则可以将其设置为true

    <?php
    
    if (isAuthenticated()) { $access = true; }
    
    if ($access == true) {
      include(controlpanel.php);
    }
    
    ?>
    
    …即使我们在

    因此,如果Wordpress团队已经初始化了所有变量(他们可能已经初始化了),那么您就不必担心全局变量的使用

    结论


    使用这3个功能/特性中的任何一个都是很糟糕的做法,我自己永远不会这么做。您确定正在使用最新版本的Wordpress吗?就像有人评论的那样,如果你使用的是最新版本,那是因为懒惰或者更糟,它仍然在那里。除了不需要太多安全性的博客,我永远不会使用Wordpress。他们这样做的原因有一个:


    确保Wordpress与大多数网络主机提供商兼容。

    在这里提出这样的问题是错误的。
    向第三方询问其他人在其他地方的原因总是一个坏主意

    很明显,除非你
    function add_magic_quotes( $array ) {
        foreach ( (array) $array as $k => $v ) {
        if ( is_array( $v ) ) {
            $array[$k] = add_magic_quotes( $v );
        } else {
                $array[$k] = addslashes( $v );
        }
    
    <?php
    
    if (isAuthenticated()) { $access = true; }
    
    if ($access == true) {
      include(controlpanel.php);
    }
    
    ?>
    
    $access = false;
    
    $GLOBALS['query_string'] = $this->query_string;
    $GLOBALS['posts'] = & $wp_query->posts;
    $GLOBALS['post'] = (isset($wp_query->post)) ? $wp_query->post : null;
    $GLOBALS['request'] = $wp_query->request;