Php 为什么WordPress仍然使用addslashes()、register_globals()和magic_引号?
为了在Wordpress中获得更多的经验,我深入研究了它的代码库,研究了它的内部工作和工作流程,当我看到以下内容时,我非常惊讶: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
addslashes()
的弱\u escape()函数仍然存在于wpdb类中)
更新:我看到他们通过使用sprintf()
和自定义placedholder来模拟准备好的语句,所以我认为查询应该是安全的。尽管如此,我还是对他们为什么不至少提供mysqli感到困惑,毕竟Mysql和PHP版本的检测是在启动序列的早期进行的
这是为了与不同的服务器和php版本兼容吗?(不过,他们很早就检查了这些功能)。
我是否遗漏了这些功能,它们在wordpress这样的环境中(或在一般情况下)有多重要?老实说,我很困惑。没有比参考以下PHP文档更好的方法来回答它们为什么不好:
那么为什么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;