Запрос WP с LIKE в meta дает странный запрос
$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_posts ВНУТРИ ПРИСОЕДИНИТЬСЯ К wp_postmeta НА (wp_posts.Идентификатор = wp_postmeta.post_id) ГДЕ 1=1 И ((wp_postmeta.meta_key = "ответ" И wp_postmeta.meta_value = "луч") ИЛИ (wp_postmeta.meta_key = "ответы" И wp_postmeta.meta_value = "луч")) И wp_posts.post_type = "вопросы" И ((wp_posts.post_status = "опубликовать")) ГРУППИРУЙТЕ ПО wp_posts.ПОРЯДОК ИДЕНТИФИКАТОРОВ ПО RAND()
Теперь замените мета_запрос compare = на НАПРИМЕР:
...
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'reference-1',
'value' => 'lucht',
'compare' => 'LIKE'
),
array(
'key' => 'reference-2',
'value' => 'lucht',
'compare' => 'LIKE'
)
)
...
Дает: ВЫБЕРИТЕ wp_posts.* ИЗ wp_posts ВНУТРИ ПРИСОЕДИНИТЬСЯ К wp_postmeta НА (wp_posts.Идентификатор = wp_postmeta.post_id) ГДЕ 1=1 И ((wp_postmeta.meta_key = "ответ" И wp_postmeta.meta_value, НАПРИМЕР '{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}lucht{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d} ') ИЛИ (wp_postmeta.meta_key = 'ответы' И wp_postmeta.meta_value, НАПРИМЕР '{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d}lucht{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d} ")) И wp_posts.post_type = "вопросы" И ((wp_posts.post_status = "опубликовать")) ГРУППИРУЙТЕ ПО wp_posts.ПОРЯДОК ИДЕНТИФИКАТОРОВ ПО RAND()
{c33232364fb7d50ba632c808436b28560295aade9067a11e1fc4ae1c5879c13d} похоже, что это какое-то случайное значение размером 64 байта в фигурных скобках. Если бы вместо этого был %, запрос работал бы просто отлично.
Я проверил это на двух устанавливается на разные серверы (4.9.5), отключены все плагины.
Вопрос: Я делаю здесь что-то не так или мне следует создать уведомление об ошибке?
1 answers
Нет, вы все делаете правильно, и это действительно должно сработать, поскольку эти заполнители удаляются позже, прежде чем фактически выполнить запрос.
Это часть меры безопасности, введенной в 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/
Если вам действительно интересно, что происходит, прочитайте сообщение в блоге Энтони Феррары, который обнаружил лежащую в основе vulnerability:https://blog.ircmaxell.com/2017/10/disclosure-wordpress-wpdb-sql-injection-technical.html