元数据中WP_QUERY WITH LIKE提供奇怪的查询

时间:2018-05-01 作者:Herbert Van-Vliet

$results = new WP_Query( array(
    \'post_type\' => \'questions\',
    \'post_status\' => \'publish\',
    \'no_found_rows\' => \'1\',
    \'nopaging\' => \'1\',
    \'ignore_sticky_posts\' => \'1\',
    \'orderby\' => \'rand\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'reference-1\',
            \'value\' => \'lucht\',
            \'compare\' => \'=\'
        ),
        array(
            \'key\' => \'reference-2\',
            \'value\' => \'lucht\',
            \'compare\' => \'=\'
        )
    )
));
echo $results->request;
给出:选择wp\\U帖子。*从wp\\u posts内部加入wp\\u postmeta ON(wp\\u posts.ID=wp\\u postmeta.post\\u ID),其中1=1和(wp\\u postmeta.meta\\u key=\'response\'和wp\\u postmeta.meta\\u value=\'lucht\')或(wp\\u postmeta.meta\\u key=\'answers\'和wp\\u postmeta.meta\\u value=\'lucht\')和wp\\u posts。post\\u类型=“问题”和((wp\\u posts.post\\u status=“发布”))按wp\\u posts分组。ID按兰德排序()

现在替换meta\\u query compare=to LIKE:

...
\'meta_query\' => array(
    \'relation\' => \'OR\',
    array(
        \'key\' => \'reference-1\',
        \'value\' => \'lucht\',
        \'compare\' => \'LIKE\'
    ),
    array(
        \'key\' => \'reference-2\',
        \'value\' => \'lucht\',
        \'compare\' => \'LIKE\'
    )
)
...
给出:选择wp\\U帖子。*从wp\\u posts内部连接wp\\u postmeta ON(wp\\u posts.ID=wp\\u postmeta.post\\u ID),其中1=1和((wp\\u postmeta.meta\\u key=\'response\'和wp\\u postmeta.meta\\u值,如{c3232364fb7d50ba632c808436b28560295aade9067a1ec4ae1f4c5879c13d}lucht{c3232364fb7d50ba632c808436b28560295aade9067a1fc4ae1f4c5879c13d})或(wp\\u postmeta.meta)eta.meta\\u键=\'answers\'和wp\\u postmeta.meta\\u值LIKE\'{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}lucht{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d})和wp\\U职位。post\\u类型=“问题”和((wp\\u posts.post\\u status=“发布”))按wp\\u posts分组。ID按兰德排序()

{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}似乎是花括号中的某个随机值64字节值。如果改为%的话,查询就可以正常工作了。

我已经在不同服务器(4.9.5)上的两次安装中对此进行了测试,并关闭了所有插件。

问题是:我在这里做错了什么,还是应该创建一个bug罚单?

1 个回复
最合适的回答,由SO网友:kraftner 整理而成

不,您所做的一切都是正确的,这实际上应该是可行的,因为这些占位符将在稍后实际执行查询之前删除。

这是引入的安全措施的一部分WordPress 4.8.3. 引用相应开发商注释:

作为WordPress 4.8.3版本的一部分,在esc_sql() 可能影响插件开发人员的行为esc_sql() 返回在构建要发送到WPDB的查询的上下文之外可用的字符串。

资料来源:https://make.wordpress.org/core/2017/10/31/changed-behaviour-of-esc_sql-in-wordpress-4-8-3/

如果您真的对发生的事情感到好奇,请阅读Anthony Ferrara发现潜在漏洞的博文:https://blog.ircmaxell.com/2017/10/disclosure-wordpress-wpdb-sql-injection-technical.html

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post