为什么WordPress仍然使用addslashes(),register_globals()和magic_quotes?

Dam*_*rsy 40 php security wordpress escaping global-variables

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

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

     // The query_vars property will be extracted to the GLOBALS. So care should
     // be taken when naming global variables that might interfere with the
     // WordPress environment.
     function register_globals() {
        global $wp_query;
        // Extract updated query vars back into global namespace.
        foreach ( (array) $wp_query->query_vars as $key => $value) {
            $GLOBALS[$key] = $value;
        }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 它们依赖于魔术引号(来自wp-includes/functions.php.maxy_quotes_gpc的exerpt在引导时关闭,在调用此函数之前):

    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 );
        }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 它们依赖于addslashes(但是自2.8.0以来它们也引入了mysql_real_escape_string,但是使用的_weak_escape()函数addslashes()仍然存在于wpdb类中)
    UPDATE:我看到它们通过使用和自定义的putholders 来模拟预处理语句sprintf(),所以我认为查询应该是安全的.仍然我很困惑为什么他们不提供至少mysqli,毕竟检测到Mysql和PHP版本发生在bootstrapping序列的早期.

现在,从SO的长达一年的频繁发展中我学到了很多东西,尤其是上面三个功能被"弃用"并显示出安全问题,并且被许多人惊恐地看着.

但WP必须有理由使用它们.我想从更有经验的程序员那里了解是否存在真正的安全问题,或者有时他们的使用方式在谣言和虚假陈述中过于笼罩.我知道magic_quotes是过去的遗产,对于addslashes来说也是如此(至少在用于数据库时),但在谷歌搜索之前我发现很多网站都在谈论使用addslashes()而不是mysql_real_escape_string().

我很想知道为什么使用那些描述不好的函数的清楚,详细的原因; Wordpress多年来经历了许多改进,涉及不同方面,但仍然使用这些功能; 因此,我正在寻找对某些积极因素的具体解释,这些积极因素会以某种方式覆盖负面因素并证明这些功能的使用是合理的.

我不是在寻找意见(我完全知道他们在这里是offtopic),也不是我在讨论Wordpress,我希望这很清楚.我想知道为什么许多php程序员认为这些功能"糟糕",然而像Wordpress这样现在处于第3版的全球巨头仍在使用它们.

这是为了兼容不同的服务器和PHP版本?(尽管如此,他们非常检查).
有没有我想念的功能,它们在wordpress(或一般)环境中有多重要?说实话,我很困惑.

hak*_*kre 32

随着时间的推移Wordpress开放门票
(随着时间的推移Wordpress开放门票)

不要依赖Wordpress代码库来对PHP编码中的良好实践或当前标准做出假设.我说这是一个在很长一段时间内摆弄wordpress开发的人.

Wordpress代码库大约有10年的历史,它充满了遗留代码[1].由于这个原因,程序无法在代码级别上发展,因此您可以找到许多解决方案,以解决当前已经解决的问题.

只需讲述这个故事:PHP有魔术引号.Wordpress开发人员认为它很有用.因此,对于那些没有配置它的主机,他们添加了它.结束需要经常和在不同地方削减输入数据的代码.简单的事情是,现在他们无法轻易地将其更改为正确的输入处理和清理,因为(超级)全局变量几乎无处不在地引入静态全局状态.

你不能轻易地重构这样的代码.

对于数据库类也是如此.它历史悠久,最初基于早期版本的ezSQL.当时没有mysql_real_escape_string,当它被引入时,WP开发人员遇到了并非所有安装基础都支持它的问题.

所以不要怀疑你在Wordpress代码中找到的编码实践.您将了解多年前可以完成的事情,以及或多或少过时的PHP版本.就在不久之前,Wordpress转而使用PHP 5.

  • 向后兼容性.
  • 针对大量(技术上或多或少过时)的主机.
  • 不要破坏有缺陷的东西.

这可能不是您的优先事项列表(希望如此),项目在这里有很多不同.但是,无论如何设置项目优先级,单独使用遗留代码库是一种负担.Wordpress只是一个例子.


[1]看到WordPress的里程碑:早期项目时间表(约2000年至2005年))

  • @gus如果那些3.61亿人都是程序员,那么bug数将是天文数字; 事实上,WP的成功是你需要能够读写才能使用它; 不要依赖使用它的人来假设代码是最优的; 毕竟,有多少台PC由Windows供电? (4认同)

reg*_*ero 12

作为@tom答案的补充.

魔术行情

自动解析整个条目并添加魔术引号都会产生错误并且无用.

  • 没用,因为你不能依靠魔术引号来保护你的输入(SQL注入的多字节编码错误就是一个例子).因此,在将数据保存到数据库之前,需要应用实际过滤器
  • 创建错误:如果你需要在保存数据库之前真正转义数据,你必须检查它是否已经被转义(并且这个设置存在并且可能由托管环境强制执行的简单事实使得你必须检查这个设置是是否设定).
  • 创建错误:用户发送的所有数据并不总是专用于数据库存储.转义它可能会破坏内容,例如考虑json内容,甚至使用危险的magic_quote_runtime文件内容
  • 创建错误:所有数据库存储都没有以相同的方式转义引号...

所以,为什么呢?,为什么我们在CMS中看到这样的功能?

  • 看到这里它是一个add_magic_quotes函数,可以在专用数组上使用,也许不在_GET或_POST上.但实际上这个函数只是使用了addslashes而不是数据库专用函数,这使得它非常糟糕.
  • 托管服务提供商可能会强制执行自动魔术报价,这对CMS开发人员来说是一场噩梦.您要么检测到它并告诉用户您拒绝运行,要么您必须管理内容可能或可能没有神奇地添加的事实......并且为了让每个人都处于相同状态,您运行非添加内容在此功能中,至少每个人都处于相同(坏)状态.
  • 从我在Wordpress上看到的内容,在stripslahes_deepwp_insert_post中执行save a之前.并且add_magic_quotes通常是在将此数据发送到wp_insert_post之前对从Db提取的数据执行的.这可能是我认为问题是在删除它们之前有效地添加斜杠...也许是因为清理过滤器发生在保存期望内容之前发生斜杠,或者可能是因为没有人记住为什么代码以这种方式运行:-)

register_globals的

似乎这是在wordpress中实现注册表模式的方式......他们希望使代码易于理解,并允许以简单的方式访问重要对象,如查询或帖子.面向对象的Registry类不是简单的PHP方式,其中$_GLOBALS数组已经是现有的注册表.

拥有一个注册表是一个完全有效的应用程序.只有当您允许某些用户输入覆盖有效的安全输入时,register_global事物才是危险的.当然,只有从$_GLOBALS其他地方(或使用global关键字)获取此安全输入时.

这里函数中的危险部分是你提取的函数的一部分,循环开启$query->query_vars.您必须跟踪调用以查看用户注入的密钥是否可以wp_parse_args在该函数中运行并结束.但是这个函数的下一部分是修复$_GLOBALS几个对象的内容:

$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;
Run Code Online (Sandbox Code Playgroud)

所以至少这些全局变量不能被用户输入覆盖并且是安全的.

所以,这些功能很糟糕.但是如果你了解他们做了什么以及你需要做些什么来防止不良影响,你可以使用它们.当您想要为开发人员实现一个简单的框架时,您可以在非常广泛的环境中使用它们.

但肯定这是一个不好的做法,你当然可以用错误的方式使用$ _GLOBALS找到坏的wordpress插件或者滥用add_magic_quotes to data pulled from dbwordpress概念.但是,Zend Framework CMS将在几年前获得如此多的贡献.


Tom*_*Tom 11

魔术行情

以下文本摘自PHP.net

http://www.php.net/manual/en/security.magicquotes.why.php

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

addslashes()vs mysql_real_escape_string()

你应该使用的原因 mysql_real_escape_string()是因为它是一个"MySQL函数",它是专门为在mysql查询中执行之前转义用户输入而创建的,而它addslashes()是一个"PHP函数".这可能听起来有点奇怪,但两者之间有一个重要的区别,它与单字节和多字节字符的使用有关.您仍然可以注入受addslashes函数保护的数据库,但注入受mysql_real_escape_string保护的数据库要困难得多.你可以在这里阅读更多相关信息

注册全球

你不应该使用的原因register_globals是因为每个人都可以访问变量,这意味着在以下示例中,如果之前尚未初始化,则可以将$ access设置为true.

<?php

if (isAuthenticated()) { $access = true; }

if ($access == true) {
  include(controlpanel.php);
}

?>
Run Code Online (Sandbox Code Playgroud)

上面的代码会给你sh#!大量的问题,但如果我们首先通过将以下内容添加到页面顶部来初始化变量

$access = false;
Run Code Online (Sandbox Code Playgroud)

......即使我们将register_globals 设为ON,我们也应该没问题

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

结论

使用这3个功能/功能中的任何一个都是不好的做法,我自己永远不会这样做.你确定你正在使用最新版本的Wordpress吗?就像有人评论说的那样,如果你使用的是最新版本,那是因为懒惰或更糟,它还在那里.除了不需要太多安全性的博客之外,我从不使用Wordpress.

  • @DamienPirsy - 是的,不知道为什么那些功能还在那里.除了不需要太多安全性的博客之外,我不会使用Wordpress. (3认同)

Rus*_*gan 7

WordPress的.我花了很多不眠之夜试图回答唯一的问题:"为什么?"

由于我遇到了它的源代码,我讨厌它.太糟糕了.让我的帖子(以及声誉)将被贬低,但这是真的.

它没有核心.有一堆代码而不是核心.它提醒php3.其中使用了大量不相关和非逻辑函数."复制并粘贴" - Wordpress中使用的唯一一种设计模式.

是的,已经使用准备好的陈述进行了模拟.但为什么他们不使用PDO或mysqli?他们已经复制了几乎所有的PDO功能,但没有使用它.使用mysqli而不是mysql需要更少的努力.

他们使用myql_real_escape_string.但仍有像protect_string_strongly,protect_string_weakly.不仅有一个功能 - do_not_protect_string_i_believe_my_users.

全局变量 - 是wordpress的哲学."如果我们不知道如何更改这个var,我们会将其标记为全局变量,每个人都会感到高兴." - 这是wordpress开发人员在开发hellpress时所想到的.

每个新版本都包含许多新的设计,他们添加新的默认主题,他们将管理区域中的背景颜色从#ccc更改为#cdcdcd,他们使用管理区域中的下拉菜单而不是accordeon.它太棒了.但他们没有改进其代码.

您是否在WP"核心"中阅读了评论?没有?而我做到了.他们真棒".像"这个函数需要什么?让我们留下以防万一." 或者"不要在新版本中硬编码".等等.

唯一的答案是"为什么?" 我得到的是:"因为它有效.如果确实有效,请不要碰它!"

wordpress.org是世界上访问量最大的网站之一.为什么?因为没有人能够理解wordpress的逻辑.每个人每次都需要在论坛上提问或阅读代码.

我希望你理解我的观点.