$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_posts.*内部连接wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )中选择1=1和( wp_postmeta.meta_key = 'response‘和wp_postmeta.meta_value = 'lucht’)或( wp_postmeta.meta_key =‘答案’和wp_postmeta.meta_value = 'lucht‘)和wp_posts.post_type =’问句‘和(wp_posts.post_status=’发布‘)。)由RAND()按wp_posts.ID顺序分组
现在替换meta_query比较=喜欢:
...
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'reference-1',
'value' => 'lucht',
'compare' => 'LIKE'
),
array(
'key' => 'reference-2',
'value' => 'lucht',
'compare' => 'LIKE'
)
)
...给出:从'{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}lucht{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}‘内部连接wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )中选择wp_posts.*,其中1=1和( wp_postmeta.meta_key = 'response’和wp_postmeta.meta_value类似于wp_postmeta.meta_key )或(wp_postmeta.meta_key= 'answers‘和wp_postmeta.meta_value类似于1=1)和wp_posts.post_type =’问句‘和((( wp_posts.post_status =‘发布’))按wp_posts.ID顺序由RAND()分组
{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}似乎是大括号中的一些随机值64字节值。如果是%,查询就会正常工作。
我在两台不同的服务器(4.9.5)上进行了测试,关闭了所有插件。
问题是:我在这里做了什么错事,还是应该创建一个bug票据?
发布于 2018-05-01 10:10:34
不,您做的一切都是正确的,这实际上应该工作,因为这些占位符将在稍后的某个点被移除,然后才能真正执行查询。
这是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_4-8-3/
如果你真的对正在发生的事情感到好奇,请阅读安东尼·费拉拉的博客文章,他发现了潜在的漏洞:https://blog.ircmaxell.com/2017/10/disclosure-wordpress-wpdb-sql-injection-technical.html
https://wordpress.stackexchange.com/questions/302389
复制相似问题